196 votes

Comment tuer un processus zombie

J'ai lancé mon programme en avant-plan ( un programme deamon). et ensuite je l'ai tué avec kill -9 mais il 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 puis-je 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    [cwmpd]
root@OpenWrt:~# kill -9 1163
root@OpenWrt:~# ps aux |grep anyprogram
 1163 root         0 Z    [cwmpd]

2 votes

Qu'est-ce que ps -o ppid 1163 dire ? C'est-à-dire, qui est le parent de 1163 ? C'est le processus auquel il faut mettre fin.

272voto

William Pursell Points 56211

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 permettre d'éliminer le zombie. (Après la mort du parent, le zombie sera hérité par init qui l'attendra et effacera son entrée dans la table des processus). Si votre démon génère des enfants qui deviennent des zombies, vous avez un bug. Votre daemon devrait remarquer quand ses enfants meurent et wait sur eux pour déterminer leur statut de sortie.

1 votes

Si le zombie est un processus mort (déjà tué), comment puis-je le supprimer de la sortie de ps aux ?

203 votes

Le zombie doit être attendu par son parent. Trouvez son parent et déterminez pourquoi il ne s'occupe pas de ses enfants, puis déposez une plainte auprès des services sociaux ;)

0 votes

Je pense que l'utilisation de SIGTERM (la valeur par défaut de "kill") serait plus appropriée, pour donner aux processus sur le point d'être tués l'opportunité de se nettoyer avant de sortir.

69voto

krishna murti Points 204

Vous pouvez tuer un processus zombie avec la commande suivante :

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

0 votes

Ceci a fonctionné pour moi. C'est essentiellement la même chose que la solution de Mohammad Rafiee, mais présentée en une seule ligne simple.

6 votes

Cette commande efface le zombie de la table des processus, mais elle ne le "tue" pas. Le zombie est déjà mort.

10 votes

El grep n'est pas nécessaire. ps ... | awk '/[zZ]/{print $2}'

41voto

Mohammad Rafiee Points 222

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 va fonctionner :)

0 votes

Dans mon cas, le zombie a été créé via un script de démarrage et un programme qui n'a pas été clairement supprimé alors je l'ai effacé .

1 votes

Ca a marché pour moi. Cela fonctionnera dans certains cas lorsque le processus défunt a été engendré par un autre processus tué.

2 votes

J'ai vérifié quel était le processus parent avant de le tuer. Et je l'ai juste tué en utilisant -9 au lieu de -1 : kill -9 {l'id du parent}

29voto

Sergio Points 281

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

2) Voici un excellent conseil d'un autre utilisateur (merci à Bill Dandreta) : Parfois

kill -9 <pid>

ne tuera pas un processus. Exécuter

ps -xal

le 4ème champ est le processus parent, tuer 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 , 18583 sont des zombies -

kill -9 18581 18582 18583

n'a aucun effet.

kill -9 31706

enlève les zombies.

25voto

Jeoffrey Points 1

J'ai essayé

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

et ça marche pour moi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X