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?
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 le 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ù un SIGTERM
et SIGINT
ne fonctionnera pas.
Pour le tuer, dans ce cas, vous souhaitez utiliser le -9
option de ligne de commande. Cela signifie envoyer le signal SIGKILL
. Vous pouvez réellement utiliser -KILL
aussi.
[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.)
Vous ne pouvez pas tuer un zombie (processus), il est déjà mort. Il attend simplement que son processus parent exécute wait(2)
et collecte son état 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 que l'un de ses enfants a pris fin (c'est-à-dire lui demander de collecter 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écupère correctement (c'est l'une des tâches principales de init
pour hériter de tout orphelin et faire la fonction 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 résoudre ou de signaler cela à la place.
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" " ")
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 ()".