matando processos automaticamente

5

Eu preciso matar todos os processos em um determinado shell, excluindo certos processos.

Por exemplo, sh , que é meu shell, e o comando.

Isso é o que está atualmente no meu shell agora.

rcihp146 :/home/msingh2> ps
   PID TTY       TIME COMMAND
  8880 pts/258   0:00 ps
  5908 pts/258   0:00 sh

Mas se houver alguns processos extras, eu gostaria de matar todos eles, excluindo os dois acima.

Eu tentei um one-liner para essa finalidade e não funcionou:

rcihp146 :/home/msingh2> ps | awk '{system("kill -9 $1")}'
sh: kill: The number of parameters specified is not correct.
sh: kill: The number of parameters specified is not correct.
sh: kill: The number of parameters specified is not correct.
sh: kill: The number of parameters specified is not correct.

... mas funciona se eu só der um pid específico como abaixo:

 rcihp146 :/home/msingh2> ps | awk '{system("kill -9 23456")}'

Preciso excluir dois ou três processos (como ps , sh ) de serem mortos.

Existe alguma maneira de fazer isso?

    
por munish 12.01.2012 / 05:59

3 respostas

5

É claro que o forro que você escreveu não funcionará, já que o $ 1 está dentro das aspas. Tente isto:

ps| gawk '{ if ($4 != "COMMAND" && $4 != "sh" && $4 != "ps") system("kill -KILL "$1) }'

Divirta-se, mas use-o com cautela. Eu geralmente não gosto de comandos do sistema no gawk, certamente não o comando "kill".

    
por 12.01.2012 / 07:47
2

Em vez de analisar a saída de ps , personalize-a ao seu gosto.

Se as opções de filtragem de ps forem suficientes para mostrar exatamente o conjunto de processos que você deseja eliminar, especifique -o pid= para mostrar apenas a coluna PID, sem linha de cabeçalho.

ps … -o pid=
 1234
56789

Como a saída contém apenas dígitos e espaço em branco, você pode usá-la diretamente em uma substituição de comando:

kill $(ps … -o pid=)

Se você precisar de mais processamento, use -o para selecionar as colunas e a ordem desejada. Veja o manual ps em seu sistema para os nomes das colunas suportadas; POSIX especifica alguns. Adicione um = após cada coluna para suprimir a linha de cabeçalho.

kill $(p=$(sh -c 'echo $PPID');
       ps -o pid= -o ppid= -o tty= -o comm= |
       awk -v "tty=${TTY#/dev/}" -v o=$$ -v p=$p '
           $1 != o && $1 != p && $2 != p && $3 == tty && $4 != "sh" {print $1}
       ')
    
por 13.01.2012 / 20:44
0

Se você precisar fazer esse tipo de coisa com frequência, instale os proctools.

pkill -v -KILL ps

mata tudo o que não é ps.

    
por 13.01.2012 / 21:52