Como matar o processo zumbi

184

Lancei meu programa em primeiro plano (um programa daemon) e o matei com ele kill -9, mas tenho um zumbi restante e não consigo matá-lo kill -9. Como matar um processo de zumbi?

Se o zumbi é um processo morto (já morto), como eu o removo da saída de ps aux?

root@OpenWrt:~# anyprogramd &
root@OpenWrt:~# ps aux | grep anyprogram
 1163 root      2552 S    anyprogramd
 1167 root      2552 S    anyprogramd
 1169 root      2552 S    anyprogramd
 1170 root      2552 S    anyprogramd
10101 root       944 S    grep anyprogram
root@OpenWrt:~# pidof anyprogramd
1170 1169 1167 1163
root@OpenWrt:~# kill -9 1170 1169 1167 1163
root@OpenWrt:~# ps aux |grep anyprogram
 1163 root         0 Z    [anyprogramd]
root@OpenWrt:~# kill -9 1163
root@OpenWrt:~# ps aux |grep anyprogram
 1163 root         0 Z    [anyprogramd]
MOHAMED
fonte
2
O que ps -o ppid 1163diz? Ou seja, quem é o pai de 1163? Esse é o processo que deve ser encerrado.
precisa

Respostas:

250

Um zumbi já está morto, então você não pode matá-lo. Para limpar um zumbi, ele deve ser aguardado pelos pais, de modo que matá-los deve trabalhar para eliminar o zumbi. (Depois que o pai morre, o zumbi será herdado pelo pid 1, que o aguardará e limpará sua entrada na tabela de processos.) Se o seu daemon gerar filhos que se tornam zumbis, você terá um bug. Seu daemon deve observar quando seus filhos morrem e waitsobre eles para determinar seu status de saída.

Um exemplo de como você pode enviar um sinal para cada processo que é o pai de um zumbi (observe que isso é extremamente bruto e pode matar processos que você não pretende. Não recomendo usar esse tipo de marreta):

# Don't do this.  Incredibly risky sledge hammer!
kill $(ps -A -ostat,ppid | awk '/[zZ]/ && !a[$2]++ {print $2}')
William Pursell
fonte
1
Se o zumbi é um processo morto (já morto), como eu o removo da saída de ps aux?
MOHAMED
186
O zumbi deve ser esperado por seus pais. Encontre o pai ou mãe e descubra por que ele não está prestando atenção aos filhos e, em seguida, registre uma reclamação nos serviços sociais. ;)
William Pursell
1
Supondo que você tenha processo de produção de um monte de zumbis faz sentido 'uniq' os ids:kill $(ps -A -ostat,ppid | awk '/[zZ]/{print $2}' | sort -u)
Ankon
2
Normalmente, você pode encontrar o pai na PPidfila se vocêcat /proc/<pid>/status
Daniel Andrei Mincă
2
Apenas imaginei pessoas que não são de TI vindo aqui e lendo isso. Louco.
ZitRo 03/04
68

Você pode limpar um processo zumbi matando o processo pai com o seguinte comando:

kill -HUP $(ps -A -ostat,ppid | grep -e '[zZ]'| awk '{ print $2 }')
krishna murti
fonte
6
Este comando limpa o zumbi da tabela de processos, mas não 'mata' o zumbi. O zumbi já está morto.
22814 William Pursell
8
O grepnão é necessário. ps ... | awk '/[zZ]/{print $2}'
precisa
2
AFAICS, esse comando não mata o zumbi, mas envia o SIGHUP para o processo pai (presumivelmente matando o pai se ele não lidar com o SIGHUP e fazendo com que o zumbi seja reparado para iniciar, conforme descrito na resposta anterior). Portanto, tenha cuidado com este comando, pode matar alguma coisa que você não estava esperando ...
Matthijs Kooijman
1
Isso não funcionou para mim. eu fiz "kill -HUP processID" e o processo ainda está lá como um zumbi
kommradHomer
1
@WilliamPursell ao responder uma pergunta, descreva a conseqüência do uso da linha de comando e o que ele faz explicitamente, porque mata todos os programas em execução no computador.
Dalek
39

Eu tentei:

ps aux | grep -w Z   # returns the zombies pid
ps o ppid {returned pid from previous command}   # returns the parent
kill -1 {the parent id from previous command}

isso vai funcionar :)

Mohammad Rafiee
fonte
No meu caso, o zumbi estava criando por meio de um script de inicialização e de um programa que não foi claramente removido, então eu o limpei.
Mohammad Rafiee 06/10
1
Trabalhou para mim. Isso funcionará em certos casos quando o processo extinto foi gerado pelo processo de morte por anteras.
Eric S. Bullington 30/01
2
Eu verifiquei o que o processo pai antes de matá-lo. E eu acabei de matar ele usando -9 em vez de -1: kill -9 {o id do pai}
Ali
Eu também tive que usar -9 matar minha vez de -1
Michael Smith
27

Encontrei-o em http://www.linuxquestions.org/questions/suse-novell-60/howto-kill-defunct-processes-574612/

2) Aqui está uma ótima dica de outro usuário (Thxs Bill Dandreta): Às vezes

kill -9 <pid>

não matará um processo. Corre

ps -xal

o quarto campo é o processo pai, mata todos os pais de um zumbi e o zumbi morre!

Exemplo

4 0 18581 31706 17 0 2664 1236 wait S ? 0:00 sh -c /usr/bin/gcc -fomit-frame-pointer -O -mfpmat
4 0 18582 18581 17 0 2064 828 wait S ? 0:00 /usr/i686-pc-linux-gnu/gcc-bin/3.3.6/gcc -fomit-fr
4 0 18583 18582 21 0 6684 3100 - R ? 0:00 /usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.6/cc1 -quie

18581, 18582, 18583São zumbis -

kill -9 18581 18582 18583

não tem efeito.

kill -9 31706

remove os zumbis.

Sergio
fonte
3
bem que acabou de matar initpor mim, e agora eu não posso fazer qualquer coisa e sou forçado a reiniciar ... o processo zumbi é Java, tendo 3.4GB de 4GB de RAM
Tcll
22

eu tentei

kill -9 $(ps -A -ostat,ppid | grep -e '[zZ]'| awk '{ print $2 }')

E funciona para mim.

Jeoffrey
fonte