você está aqui: Home  → Arquivo de Mensagens

Faça a sua vida mais facil com o uso de aliases (cont.)

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


Veja a relação completa dos artigos de Gustavo Chaves