Autre moyen de tuer un processus zombie

19

Je viens de remarquer quelques processus zombies sur CentOS 6.8 (Final), j'ai essayé de les tuer mais ils sont toujours là:

[root@host user]# ps -ef | grep git
tomcat     746     1  0 Jul18 ?        00:00:00 git clone https://github.com/angular/bower-angular.git -b v1.3.20 --progress . --depth 1
tomcat     747   746  0 Jul18 ?        00:00:00 [git-remote-http] <defunct>
root     20776 20669  0 09:03 pts/3    00:00:00 grep git
tomcat   29970     1  0 Jul18 ?        00:00:00 git clone https://github.com/components/jqueryui.git -b 1.12.0 --progress . --depth 1
tomcat   29971 29970  0 Jul18 ?        00:00:00 [git-remote-http] <defunct>

[root@host user]# kill 746 747 29970 29971

[root@host user]# ps -ef | grep git
tomcat     746     1  0 Jul18 ?        00:00:00 git clone https://github.com/angular/bower-angular.git -b v1.3.20 --progress . --depth 1
tomcat     747   746  0 Jul18 ?        00:00:00 [git-remote-http] <defunct>
root     21525 20669  0 09:26 pts/3    00:00:00 grep git
tomcat   29970     1  0 Jul18 ?        00:00:00 git clone https://github.com/components/jqueryui.git -b 1.12.0 --progress . --depth 1
tomcat   29971 29970  0 Jul18 ?        00:00:00 [git-remote-http] <defunct>

Comme vous pouvez le voir, ils fonctionnent pendant deux mois, et s'ils ne sont pas dangereux, je m'en débarrasserais, une autre façon de tuer un zombie?

lèse
la source
1
as-tu essayé kill -9?
Ipor Sircer
7
Seuls 747et 29971sont des processus zombies. Les autres pourraient être enfermés mais ils ne sont pas encore morts.
roaima
Il semble que vous ayez un bogue dans du code fonctionnant sur tomcat ...
Boris the Spider

Réponses:

8

Comme mentionné par Heemayl, vous ne pouvez pas réellement tuer un zombie. Il est déjà [un] mort ...

Cependant, le problème auquel vous êtes confronté ressemble à un problème avec la git clonecommande. Il se bloque en quelque sorte. Expire probablement ou échoue d'une autre manière? C'est souvent à cause de certaines E / S qu'un processus est bloqué au point où a SIGTERMet SIGINTne fonctionnera pas.

Pour le tuer, dans ce cas, vous souhaitez utiliser l' -9option de ligne de commande. Cela signifie envoyer le SIGKILLsignal. Vous pouvez -KILLégalement l' utiliser .

[root@host user]# kill -KILL 746 29970

Pour obtenir une liste des signaux disponibles, utilisez l'option de ligne de commande list.

[root@host user]# kill -l

Cela vous montre les numéros et les noms (et vous verrez que # 9 indique SIGKILL.)

Alexis Wilke
la source
1
En fait, kill -KILLc'était la seule commande capable de fermer ces processus, c'est pourquoi je vais accepter la réponse de @Alexis Wilke. Mais j'aimerais certainement exprimer ma gratitude à la réponse +1, @heemayl rapide, sage et très informative. Merci à tous
lese
39

Vous ne pouvez pas tuer un zombie (processus), il est déjà mort. Il attend simplement que son processus parent le fasse wait(2)et recueille son statut de sortie. Il ne prendra aucune ressource sur le système autre qu'une entrée de table de processus.

Vous pouvez envoyer SIGCHLDà son parent pour lui faire savoir qu'un de ses enfants a pris fin (c'est-à-dire lui demander de récupérer le statut de sortie de l'enfant). Ce signal peut être ignoré (qui est la valeur par défaut):

kill -CHLD <PPID>

(Remplacez <PPID>par le PID réel du parent.)

Ou vous pouvez tuer le processus parent afin que init(PID 1) hérite du processus zombie et le récolte correctement (c'est l'une des initprincipales tâches d'hériter de tout orphelin et de le faire wait(2)régulièrement). Mais tuer le parent n'est pas recommandé. En règle générale, la création de processus zombies indique un ou des problèmes de programmation, et vous devriez essayer de les corriger ou de les signaler à la place.

heemayl
la source
8
Vous pouvez envoyer SIGCHLD à son parent pour lui faire savoir que si son enfant est terminé (c'est-à-dire lui demander de collecter le statut de sortie de l'enfant), ce signal peut être ignoré (par défaut) Le problème avec cela est que si un processus ignore SIGCHLD, pas de zombie serait créé. Donc, si ce n'est pas ignoré SIGCHLD, et que les zombies ne sont pas récoltés, le processus est soit bogué ou ne se soucie pas des enfants zombies. Étant donné que le processus en question est git clone ..., je parie qu'il ne se soucie tout simplement pas des enfants zombies, car c'est un processus (espérons-le) de courte durée qui fait son travail et se termine.
Andrew Henle
1
@AndrewHenle: Bien que cela soit généralement vrai, l'action par défaut ( SIG_DFL) pour SIGCHILDest également de l'ignorer, mais dans ce cas, les zombies ne sont certainement pas automatiquement récoltés.
R ..
@R Bien que cela soit généralement vrai, l'action par défaut ( SIG_DFL) pour SIGCHILDest également de l'ignorer, mais dans ce cas, les zombies ne sont certainement pas automatiquement récoltés. Je ne sais pas de quoi vous parlez. Faites-vous allusion aux processus qui ne sont pas récoltés dans la question? Je ne vois pas comment l'envoi SIGCHLDà un processus dont le SIGCHLDgestionnaire est défini sur SIG_IGN(explicitement ou par défaut) va amener ce processus à récolter des zombies.
Andrew Henle
1
@AndrewHenle, l'envoi d'un SIGCHLDpeut fonctionner cette fois . La dernière fois, il a peut-être raté le signal ou deux enfants sont morts en même temps et le code n'est pas assez intelligent pour gérer les deux décès simultanément.
Alexis Wilke
Ça ne peut pas faire de mal, mais je ne mettrais aucune chance que ça marche.
Barmar
2

pour rechercher des processus zombies:

ps aux | grep -w Z | grep -v grep

ps -eo stat,ppid | grep -w Z

pour tuer le processus zombie, les ID parents doivent être tués, c'est-à-dire PPID:

kill PPID1 PPID2

kill $(ps -eo stat,ppid|grep -w Z|awk '{print $2}'|tr "\n" " ")
user218243
la source
0

Lorsqu'un processus parent meurt, tous les processus zombies sont nettoyés. Ne tuez pas le processus parent juste pour nettoyer le processus zombie. Il reviendra lorsque vous réexécuterez votre programme. Corrigez votre programme en appelant correctement l'appel système «wait ()» ou «waitpid ()».

Sumanth S
la source