web-dev-qa-db-fra.com

Autre moyen de tuer un processus zombie

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?

19
lese

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.)

8
Alexis Wilke

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.

39
heemayl

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" " ")
3
user218243

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 ()".

0
Sumanth S