Réponses:
Les processus zombies sont déjà morts. Vous ne pouvez pas les tuer. La kill
commande ou l'appel système n'a aucun effet sur un processus zombie. (Vous pouvez faire partir un zombie kill
, mais vous devez tirer sur le parent, pas sur le zombie, comme nous le verrons dans une minute.)
Un processus zombie n'est pas vraiment un processus, c'est seulement une entrée dans la table des processus. Il n'y a pas d'autres ressources associées au processus zombie: il n'a pas de mémoire ou de code en cours d'exécution, il ne contient aucun fichier ouvert, etc.
Lorsqu'un processus meurt, la dernière chose à faire, après le nettoyage de toutes les autres ressources, est l'entrée dans la table de processus. Cette entrée est conservée, formant un zombie, pour permettre au processus parent de suivre l'état de sortie de l'enfant. Le parent lit l'état de sortie en appelant l'un des membres de la wait
famille des appels système; à ce stade, le zombie disparaît. Appel wait
est dit récolter l'enfant, l' extension de la métaphore d'un zombie étant mort , mais d'une manière encore pas complètement transformé en la vie après la mort. Le parent peut également indiquer qu'il s'en fiche (en ignorant le signal SIGCHLD, ou en appelant sigaction
avec l' SA_NOCLDWAIT
indicateur), auquel cas l'entrée dans la table de processus est supprimée immédiatement lorsque l'enfant meurt.
Ainsi, un zombie n'existe que lorsqu'un processus est mort et que son parent n'a pas wait
encore appelé . Cet état ne peut durer que tant que le parent est toujours en cours d'exécution. Si le parent décède avant l'enfant ou décède sans lire le statut de l'enfant, le processus parent du zombie est défini sur le processus avec PID 1, qui est init
. L'une des tâches de init
est d'appeler wait
en boucle et de récolter ainsi tout processus zombie laissé par son parent.
Vous n'avez pas de kill
processus zombie, car il est déjà mort.
Les processus zombies doivent être wait
édités par leurs parents, afin que leur statut de sortie soit collecté.
Le seul "mécanisme de nettoyage intégré" qui existe sous Linux fonctionne pour le cas où tout processus parent meurt avant de collecter le statut de sortie de ses enfants. Dans ce cas, chaque enfant est hérité par le init
processus qui, wait
sur l'enfant, collectera son état de sortie et supprimera son entrée dans la table de processus.
Dès que le parent d'un processus décède, le processus devient orphelin - sans tenir compte du fait qu'il s'agit d'un zombie ou non. Qu'arrive-t-il aux orphelins? Ils obtiennent un nouveau parent, appelé init
. init
sera wait
sur chaque orphelin qu'il a collecté, récoltant ainsi l'orphelin (qui peut aussi avoir été un zombie).
Non, il n'y a pas de mécanisme de nettoyage intégré pour les zombies. Les zombies vont au paradis des zombies une fois que leurs parents sont tués. Jusque-là, le système d'exploitation les garde pour retourner le statut de sortie au parent.
init
processus prend le relais et appellera wait
il
init
ne tue aucun processus. Ilwait
n'appartient qu'à ses enfants de récupérer leur statut.