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.


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

Adicionar comentário

* Campos obrigatórios
5000
Powered by Commentics

Comentários

Nenhum comentário ainda. Seja o primeiro!


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