When you want to kill processes, it's a pain in the neck to run ps ( 38.5 ) , figure out the process ID, and then kill the process. The zap shell script was presented by Brian Kernighan and Rob Pike in their classic book The UNIX Programming Environment . The script uses egrep ( 27.5 ) to pick the processes to kill; you can type extended expressions that match more than one process, such as:
%zap 'troff|fmat'
PID TTY TIME CMD 22117 01 0:02 fmat somefile?n
22126 01 0:15 sqtroff -ms somefile?y
We've reprinted the script by permission of the authors:
`...` |
#! /bin/sh # zap pattern: kill all processes matching pattern PATH=/bin:/usr/bin IFS=' ' # just a newline case $1 in "") echo 'Usage: zap [-2] pattern' 1>&2; exit 1 ;; -*) SIG=$1; shift esac echo ' PID TTY TIME CMD' kill $SIG `pick \`ps -ag | egrep "$*"\` | awk '{print $1}'` |
---|
The
ps -ag
command displays all processes on the system. Leave off the
a
to get just your processes. Your version of
ps
may need
different options (
38.5
)
.
This shell version of zap calls another script, pick , shown below. [6] pick shows each of its command-line arguments and waits for you to type y , q , or anything else. Answering y writes the line to standard output, answering q aborts pick without showing more lines, and any other answer shows the next input line without printing the current one. zap uses awk ( 33.11 ) to print the first argument (the process ID number) from any ps line you've selected with pick . The inner set of nested ( 45.31 ) backquotes ( 9.16 ) in zap pass pick the output of ps , filtered through egrep . Because the zap script has set the IFS variable ( 35.21 ) to just a newline, pick gets and displays each line of ps output as a single argument. The outer set of backquotes passes kill ( 38.10 ) the output of pick , filtered through awk .
[6] The MH mail system also has a command named pick . If you use MH, you could rename this script to something like choose .
If you're interested in shell programming and that explanation wasn't detailed enough, take a careful look at the scripts - they're really worth studying. (This book's shell programming chapters, 44 through 46, may help, too.) Here's the pick script:
-n /dev/tty done < |
#!/bin/sh # pick: select arguments PATH=/bin:/usr/bin for i do echo -n "$i? " >/dev/tty read response case $response in y*) echo $i ;; q*) break esac done </dev/tty |
---|
-