De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.
Colaboração: Gustavo Chaves
Data de Publicação: 08 de Junho de 1998
Na minha experiência de administrador muitas vezes executo o
ps -ef|grep x para saber o PID de um processo e poder mata-lo com um
kill.
Ha um ou dois anos eu li o classico `The UNIX Programming Environment', do Kernighan e do Pike, e eles implementam um script chamado zap que eu achei muito interessante. Ele aceita os mesmos argumentos que o kill, mas no lugar do PID do processo ele aceita uma expressão regular do tipo que o egrep aceita. Um exemplo da bem a idéia do que ele faz:
$ zap netscape
gustavo 4543 4524 0 18:17:23 ? 0:00 /bin/sh -c `netscape [y/N]?n
gustavo 4544 4543 3 18:17:24 ? 5:16 netscape [y/N]?n
$
As linhas são apresentadas uma a uma e eu devo teclar y ou n pra
dizer se quero ou não dar um kill no processo.
Como não tenho o livro em mãos, eu resolvi implementar o zap a partir da sua `especificação'. O resultado é o script abaixo.
--------------------
#!/bin/sh
# $Id: zap,v 1.6 1997/08/19 20:44:55 gustavo Exp $
# I got this idea when skimming the Kernigham's book `UNIX Programming
# Environment'. I don't have the source, hence the different
# implementation. This is handy for sysadmins who do a lot of `ps'
# followed by ""kill'. Instead of""kill PID', use `zap REGEXP', where
# REGEXP is an egrep-like regular expression that will be matched
# against the ps's output. Every matching line is presented to the
# user asking him to tell if the process in question must be killed or
# not. zap can take an option telling which signal to use in the
# killing.
PATH=/usr/bin:/bin:/sbin; export PATH
PROGNAME=$0
OS=""uname -s""_""uname -r""
case $OS in
SunOS_4*)
PS='ps auxww'
ECHON='echo -n'
;;
SunOS_5*)
PS='ps -ef'
ECHON='/usr/ucb/echo -n'
;;
OSF*|HP-UX*|AIX*)
PS='ps -ef'
ECHON='echo -n'
;;
*)
echo "Unknown system: $OS"
exit 2
esac
usage() {
echo "usage: ""basename $PROGNAME"" [-SIG] [--] regexp"
exit 1
}
case "$1" in
-*) SIG=$1; shift ;;
*) SIG=-15 ;;
esac
if [ "$1" = "--" ]; then
shift
fi
if [ $# -eq 1 ]; then
REGEXP=$1
else
usage
fi
TTY=""tty""
TMP=/tmp/zap.$$
$PS >$TMP
egrep -- "$1" $TMP |
while read UID PID REST; do
if [ "$PID" -ne $$ ]; then
$ECHON "$UID $PID $REST [y/N]?"
read ANSWER <$TTY
case "$ANSWER" in
y|Y) kill $SIG $PID;;
esac
fi
done
rm -f $TMP