Como encontrar o processo zumbi?

84
System information as of Fri Mar  9 19:40:01 KST 2012

  System load:    0.59               Processes:           167
  Usage of /home: 23.0% of 11.00GB   Users logged in:     1
  Swap usage:     0%                 IP address for eth1: 192.168.0.1

  => There is 1 zombie process.

  Graph this data and manage this system at https://landscape.canonical.com/

10 packages can be updated.
4 updates are security updates.

Last login: Fri Mar  9 10:23:48 2012
a@SERVER:~$ ps auxwww | grep 'Z'
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
usera     13572  0.0  0.0   7628   992 pts/2    S+   19:40   0:00 grep --color=auto Z
a@SERVER:~$ 

Como encontrar esse processo zumbi?

    
por Pablo 09.03.2012 / 11:44

6 respostas

96

Para matar um zumbi (processo) você tem que matar seu processo pai (assim como zumbis reais!), mas a questão era como encontrá-lo.

Encontre o zumbi (a pergunta foi respondida nesta parte):

a@SERVER:~$ ps aux | grep 'Z'

O que você recebe é Zombies e qualquer outra coisa com um Z, então você também receberá o grep:

USER       PID     %CPU %MEM  VSZ    RSS TTY      STAT START   TIME COMMAND
usera      13572   0.0  0.0   7628   992 pts/2    S+   19:40   0:00 grep --color=auto Z
usera      93572   0.0  0.0   0      0   ??       Z    19:40   0:00 something

Encontre o pai do zumbi:

a@SERVER:~$ pstree -p -s 93572

Irá dar-lhe:

init(1)---cnid_metad(1311)---cnid_dbd(5145)

Neste caso, você não quer matar o processo pai e deve ficar muito feliz com um zumbi, mas matar o processo pai imediato 5145 deve se livrar dele.

Recursos adicionais no askubuntu:

por Duncanmoo 03.05.2013 / 10:39
26

Embora essa pergunta seja antiga, achei que todos mereciam uma resposta mais confiável:

ps axo pid=,stat=

Isso emitirá duas colunas delimitadas por espaços em branco, a primeira das quais é um PID e a segunda é o seu estado.

Eu não acho que mesmo o GNU ps forneça uma maneira de filtrar por estado diretamente, mas você pode fazer isso de forma confiável com awk

ps axo pid=,stat= | awk '~/^Z/ { print }'

Agora você tem uma lista de PIDs que são zumbis. Como você conhece o estado, não é mais necessário exibi-lo para que possa ser filtrado.

ps axo pid=,stat= | awk '~/^Z/ { print  }'

Fornecendo uma lista delimitada por novas linhas de PIDs zumbis.

Agora você pode operar nesta lista com um simples loop de shell

for pid in $(ps axo pid=,stat= | awk '~/^Z/ { print  }') ; do
    echo "$pid" # do something interesting here
done

ps é uma ferramenta poderosa e você não precisa fazer nada complicado para obter informações do processo.

    
por Sorpigal 25.01.2014 / 21:29
4

ps aux | awk '{ print " " }' | grep -w Z

De: link

Dos comentários melhorados:

for p in $(ps jauxww | grep Z | grep -v PID | awk '{print }'); do
    for every in $(ps auxw | grep $p | grep cron | awk '{print }'); do
        kill -9 $every;
    done;
done;

Cuidado: este também mata o processo.

    
por Rinzwind 09.03.2012 / 11:48
1

Menos é mais:

ps afuwwx | less +u -p'^(\S+\s+){7}Z.*'

É assim, me dê uma floresta (tree) dos processos de todos os usuários em um formato orientado ao usuário com largura ilimitada em qualquer tty e mostre para mim em metade de uma tela acima de onde corresponde a 8ª coluna Z, e por que não destacar toda a linha.

O formato orientado ao usuário parece significar: USER, PID, %CPU, %MEM, VSZ, RSS, TTY, STAT, START, TIME, COMMAND para que o status de zumbi apareça na oitava coluna.

Você pode lançar um N antes do p , se quiser números de linha, e um J , se quiser um asterisco no jogo. Infelizmente, se você usar G para não destacar a linha, o asterisco não será exibido, embora J crie espaço para ele.

Você acaba conseguindo algo parecido com:

…
  root      2919  0.0  0.0  61432  5852 ?      Ss Jan24 0:00 /usr/sbin/sshd -D
  root     12984  0.0  0.1 154796 15708 ?      Ss 20:20 0:00  \_ sshd: lamblin [priv]
  lamblin  13084  0.0  0.0 154796  9764 ?      S  20:20 0:00      \_ sshd: lamblin@pts/0
* lamblin  13086  0.0  0.0  13080  5056 pts/0  Z  20:20 0:00          \_ -bash <defunct>
  lamblin  13085  0.0  0.0  13080  5056 pts/0  Ss 20:20 0:00          \_ -bash
  root     13159  0.0  0.0 111740  6276 pts/0  S  20:20 0:00              \_ su - nilbmal
  nilbmal  13161  0.2  0.0  13156  5004 pts/0  S  20:20 0:00                  \_ -su
  nilbmal  13271  0.0  0.0  28152  3332 pts/0  R+ 20:20 0:00                      \_ ps afuwwx
  nilbmal  13275  0.0  0.0   8404   848 pts/0  S+ 20:20 0:00                      \_ less +u -Jp^(\S+\s+){7}Z.*
…

Você poderia seguir com (e ele detectará se seu terminal gosta de -U Unicode ou -A Ascii):

pstree -psS <PID LIST>

OU apenas, você sabe, use a seta para cima em less para seguir essa árvore / floresta pela hierarquia; que é o que eu recomendava com a abordagem "Menos é mais".

    
por dlamblin 14.02.2018 / 11:40
0

Sugiro-lhe este comando:

ps aux | awk '"[Zz]" ~  { printf("%s, PID = %d\n", , ); }'
    
por Peycho Dimitrov 04.05.2015 / 17:13
0

Para listar zumbis do processo, tente este comando:

ps j | awk ' ~ "Z"'

Pode ser necessário alterar dependendo do seu sistema operacional.

Isso também retornará a lista de seus IDs do processo pai ( PPID ).

Para tentar matar os zumbis (depois de testar o comando acima), tente:

kill -9 $(ps j | awk 'NR>1 &&  ~ "Z" {print }')

Para identificar os pais, tente com pstree , como:

$ ps j | awk 'NR>1 &&  ~ "T" {print }' | xargs -L1 pstree -sg
systemd(1)───sshd(1036)───sshd(2325)───sshd(2325)───bash(2383)───zombie(2430)
systemd(1)───sshd(1036)───sshd(2325)───sshd(2325)───bash(2383)───zombie(2431)
systemd(1)───sshd(1036)───sshd(2325)───sshd(2325)───bash(2383)───zombie(2432)
    
por kenorb 19.02.2016 / 22:12