Comment tuer le processus zombie

187

J'ai lancé mon programme au premier plan (un programme démon), puis je l'ai tué avec kill -9, mais il me reste un zombie et je ne peux pas le tuer avec kill -9. Comment tuer un processus zombie?

Si le zombie est un processus mort (déjà tué), comment le supprimer de la sortie 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
la source
2
Que ps -o ppid 1163dit-on? Autrement dit, qui est le parent de 1163? C'est le processus qu'il faut mettre fin.
William Pursell

Réponses:

255

Un zombie est déjà mort, vous ne pouvez donc pas le tuer. Pour nettoyer un zombie, il doit être attendu par son parent, donc tuer le parent devrait fonctionner pour éliminer le zombie. (Après la mort du parent, le zombie sera hérité par pid 1, qui l'attendra et effacera son entrée dans la table de processus.) Si votre démon génère des enfants qui deviennent des zombies, vous avez un bogue. Votre démon devrait remarquer quand ses enfants meurent et waitsur eux pour déterminer leur statut de sortie.

Un exemple de la façon dont vous pourriez envoyer un signal à chaque processus qui est le parent d'un zombie (notez que cela est extrêmement grossier et peut tuer des processus que vous n'avez pas l'intention. Je ne recommande pas d'utiliser ce type de marteau):

# Don't do this.  Incredibly risky sledge hammer!
kill $(ps -A -ostat,ppid | awk '/[zZ]/ && !a[$2]++ {print $2}')
William Pursell
la source
1
Si le zombie est un processus mort (déjà tué), comment le supprimer de la sortie de ps aux?
MOHAMED
187
Le zombie doit être attendu par son parent. Trouvez son parent et découvrez pourquoi ce parent ne fait pas attention à ses enfants, puis déposez une plainte auprès des services sociaux. ;)
William Pursell
1
En supposant que vous ayez un processus de production de nombreux zombies, il est logique de `` uniq '' les identifiants:kill $(ps -A -ostat,ppid | awk '/[zZ]/{print $2}' | sort -u)
ankon le
2
généralement, vous pouvez trouver le parent dans la PPidrangée si vouscat /proc/<pid>/status
Daniel Andrei Mincă
3
Je viens d'imaginer des personnes non-IT venant ici et lisant ceci. Fou.
ZitRo
69

Vous pouvez nettoyer un processus zombie en tuant son processus parent avec la commande suivante:

kill -HUP $(ps -A -ostat,ppid | grep -e '[zZ]'| awk '{ print $2 }')
Krishna Murti
la source
6
Cette commande efface le zombie de la table de processus, mais elle ne «tue» pas le zombie. Le zombie est déjà mort.
William Pursell
10
Le grepn'est pas nécessaire. ps ... | awk '/[zZ]/{print $2}'
William Pursell
2
AFAICS, cette commande ne tue pas le zombie, mais envoie SIGHUP à son processus parent (probablement en tuant le parent s'il ne gère pas SIGHUP et en provoquant la réparation du zombie à init, comme décrit dans la réponse précédente). Alors soyez prudent avec cette commande, cela pourrait tuer quelque chose que vous ne vous attendiez pas à ...
Matthijs Kooijman
1
Cela n'a pas fonctionné pour moi. J'ai fait "kill -HUP processID" et le processus est toujours là en tant que zombie
kommradHomer
1
@WilliamPursell lorsque vous répondez à une question, veuillez décrire les conséquences de l'utilisation de la ligne de commande et ce qu'elle fait explicitement car elle tue tous les programmes en cours d'exécution sur l'ordinateur.
Dalek
39

J'ai essayé:

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}

cela fonctionnera :)

Mohammad Rafiee
la source
Dans mon cas, le zombie créait via un script de démarrage et un programme qui n'a pas été clairement supprimé, alors je l'ai effacé.
Mohammad Rafiee
1
A travaillé pour moi. Cela fonctionnera dans certains cas lorsque le processus défunt a été engendré par un processus tué par une anthère.
Eric S.Bullington
2
J'ai vérifié ce que le processus parent avant de le tuer. Et je viens de le tuer en utilisant -9 au lieu de -1: kill -9 {the parent id}
Ali
J'ai aussi dû utiliser -9 pour tuer le mien au lieu de -1
Michael Smith
28

Je l'ai trouvé à http://www.linuxquestions.org/questions/suse-novell-60/howto-kill-defunct-processes-574612/

2) Voici un bon conseil d'un autre utilisateur (Thxs Bill Dandreta): Parfois

kill -9 <pid>

ne tuera pas un processus. Courir

ps -xal

le 4ème champ est le processus parent, tuez tous les parents d'un zombie et le zombie meurt!

Exemple

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, 18583Sont des zombies -

kill -9 18581 18582 18583

n'a aucun effet.

kill -9 31706

supprime les zombies.

Sergio
la source
4
eh bien cela vient de tuer initpour moi, et maintenant je ne peux rien faire et je suis obligé de redémarrer ... le processus zombie est Java, prenant 3,4 Go sur 4 Go de RAM
Tcll
23

j'ai essayé

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

Et cela fonctionne pour moi.

Jeoffrey
la source
0

Parfois, le ppid parent ne peut pas être tué, donc tuez le pid zombie

kill -9 $(ps -A -ostat,pid | awk '/[zZ]/{ print $2 }')
Thiago Conrado
la source