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?
kill -9
?747
et29971
sont des processus zombies. Les autres pourraient être enfermés mais ils ne sont pas encore morts.Réponses:
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 clone
commande. 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ù aSIGTERM
etSIGINT
ne fonctionnera pas.Pour le tuer, dans ce cas, vous souhaitez utiliser l'
-9
option de ligne de commande. Cela signifie envoyer leSIGKILL
signal. Vous pouvez-KILL
également l' utiliser .Pour obtenir une liste des signaux disponibles, utilisez l'option de ligne de commande list.
Cela vous montre les numéros et les noms (et vous verrez que # 9 indique SIGKILL.)
la source
kill -KILL
c'é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 à tousVous 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):(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 desinit
principales tâches d'hériter de tout orphelin et de le fairewait(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.la source
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 estgit 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.SIG_DFL
) pourSIGCHILD
est également de l'ignorer, mais dans ce cas, les zombies ne sont certainement pas automatiquement récoltés.SIG_DFL
) pourSIGCHILD
est é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'envoiSIGCHLD
à un processus dont leSIGCHLD
gestionnaire est défini surSIG_IGN
(explicitement ou par défaut) va amener ce processus à récolter des zombies.SIGCHLD
peut 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.pour rechercher des processus zombies:
pour tuer le processus zombie, les ID parents doivent être tués, c'est-à-dire PPID:
la source
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 ()».
la source