Como encontrar o processo de zumbi?

100
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?

Pablo
fonte
por que você não abre o monitor do sistema e procura pelo processo de zumbi?
dlin 6/07/12
8
Como fazer isso em um servidor no-X decapitado?
SabreWolfy
2
Surpreendente que nenhuma resposta abaixo realmente diga que não há processo de zumbi no sistema com base na saída acima. Se realmente houvesse um, o ps auxwww | grep 'Z'comando deveria ter mostrado um processo em um Zestado. O ditado "informações do sistema" => There is 1 zombie process.parece ser um bug. Ou isso, ou faltam informações na pergunta.
Arielf 06/06/19

Respostas:

126

Para matar um zumbi (processo), você deve matar o processo pai (como zumbis de verdade!), Mas a questão era como encontrá-lo.

Encontre o zumbi (a pergunta respondeu a esta parte):

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

O que você obtém é 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

Darei à você:

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

Nesse caso, você não deseja matar esse processo pai e deve estar muito feliz com um zumbi, mas matar o processo pai imediato 5145 deve se livrar dele.

Recursos adicionais no askubuntu:

Duncanmoo
fonte
1
O resultado que você mostra na sua resposta é o próprio comando grep, não o processo zumbi. É a mesma má interpretação que Pablo fez em sua resposta. A resposta de Rinzwind abaixo, na verdade, procura o processo de zumbi e os lista. Outra opção poderia ser a de pesquisar por "extinta"
FVD
pstree -H your_desired_pid -p
Greg M. Krsak
Obrigado Greg por ter contribuído para a discussão, mas lembre-se de que este é um site de ajuda, apenas colar um comando sem explicar nada não é útil para a maioria das pessoas que vem aqui procurando ajuda.
Duncanmoo
1
Esta é uma ótima resposta! Ainda é válido hoje! Consegui encontrar meu processo de zumbi e matar seu processo pai sem problemas. Obrigado!
Terrance
1
Se você não tem pstree instalado, ps wauxffaz a mesma coisa
JDS
35

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.

Acho que nem o GNU psfornece uma maneira de filtrar diretamente por estado, mas você pode fazer isso de maneira confiável comawk

ps axo pid=,stat= | awk '$2~/^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 '$2~/^Z/ { print $1 }'

Fornecendo uma lista delimitada por nova linha de PIDs de zumbis.

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

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

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

(Significado dos diferentes estados do processo aqui - https://unix.stackexchange.com/a/18477/121634 )

Sorpigal
fonte
2
awktambém é uma ferramenta poderosa que não apenas divide o texto, mas também pode combiná-lo. +1 ... os outros usavam greponde é desnecessário e impreciso.
0xC0000022L
agora que eu tenho uma lista de processos zumbis. como eu os mato?
chovy
@ Chovy: Depende, mas geralmente envolve matar ou sinalizar os pais. Outras respostas aqui vão para isso. De dentro do circuito mostrado acima, você pode encontrar o PID pai assim:ps -p "$pid" -opid=,ppid=
Sorpigal
se eu for o pai, ele não matará todos os seus processos filhos? Eu só quero matar o processo de um zumbi. Eu conheço o ppid.
chovy
1
Eu sugiro adicionar ppid=à lista de opções, portanto, não é necessário usar um comando separado para obter o ppid.
Ding-Yi Chen
3

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

De: http://www.cyberciti.biz/tips/killing-zombie-process.html

Dos comentários, um melhorado:

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

Cuidado, porém: este também mata os processos.

Rinzwind
fonte
ainda não retorna nada. Eu acho que meu caminho também não estava errado.
Pablo
O segundo exemplo é infernalmente não confiável e o primeiro é desnecessariamente detalhado (tente em ps axo pid=,stat= | awk '$2~/Z/ {print $1}'vez disso).
Sorpigal 07/04
3

Menos é mais:

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

É como, dê-me uma floresta (árvore) de todos os processos dos usuários em um formato orientado ao usuário com largura ilimitada em qualquer tty e mostre-a na metade da tela acima, onde corresponde ao caso em que a 8a coluna contém um 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, COMMANDportanto, o status Zombie será exibido na 8ª coluna.

Você pode inserir um Nantes do pse quiser números de linha e um Jse quiser um asterisco na partida. Infelizmente, se você Gnão destacar a linha que o asterisco não mostrará, isso Jcria espaço para ele.

Você acaba recebendo 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ê pode acompanhar isso com (e ele detectará se o seu terminal gosta de -U Unicode ou -A Ascii):

pstree -psS <PID LIST>

OU apenas, você sabe, use a seta lesspara cima para seguir a árvore / floresta através da hierarquia; que é o que eu estava recomendando com a abordagem "Menos é mais".

dlamblin
fonte
0

Eu sugiro a você este comando:

ps aux | awk '"[Zz]" ~ $8 { printf("%s, PID = %d\n", $8, $2); }'
Peycho Dimitrov
fonte
O uso auxe a retirada de cadeias de caracteres são desnecessariamente confiáveis ​​quando você pode usar -oe solicitar exatamente o que deseja. Use em ps ax -o pid=,stat= | awk '$2 ~ "[Zz]" { printf("%s, PID = %d\n", $2, $1); }'vez disso.
Sorpigal
-1

Para listar os zumbis do processo, tente este comando:

ps j | awk '$7 ~ "Z"'

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

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

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

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

Para identificar seus pais, tente com pstree, como:

$ ps j | awk 'NR>1 && $7 ~ "T" {print $2}' | 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)
kenorb
fonte
Recorrer a retirar uma coluna do jformato para isso é desnecessariamente complicado. Use -opara selecionar o que você deseja.
Sorpigal 23/02
2
ps jnão imprime todos os processos no sistema. Ele lista apenas os procs do usuário atual (no estilo de trabalhos do BSD), para que ele perca os processos zumbis.
Arielf 06/06/19