Qu'est-ce qu'un processus zombie et comment puis-je le tuer?

Réponses:

17

Oh mon Dieu! Non non Non. N'utilisez pas kill -9.

Cela ne donne pas au processus une chance de proprement:

  1. arrêter les connexions de prise

  2. nettoyer les fichiers temporaires

  3. informer ses enfants qu'il s'en va

  4. réinitialiser ses caractéristiques de terminal et ainsi de suite et ainsi de suite.

Généralement, envoyez 15 et attendez une seconde ou deux, et si cela ne fonctionne pas, envoyez 2, et si cela ne fonctionne pas, envoyez 1. Si cela ne fonctionne pas, ENLEVEZ LE BINAIRE car le programme est mal conçu!

N'utilisez pas kill -9. Ne sortez pas la moissonneuse-batteuse simplement pour ranger le pot de fleurs.

Severe_admin
la source
13
tuer -9 ne tuera pas les zombies. Vous devez tuer leur parent, regardez pstree.
LapTop006
3
@ LapTop006: Dans ce cas, ils ressemblent davantage à des vampires; tuez le vampire principal pour arrêter l'invasion.
amphetamachine
2
Cette réponse est fausse à peu près de toutes les manières. Le processus est terminé. il a déjà arrêté ses connexions, nettoyé les fichiers temporaires, etc. Ne supprimez pas le binaire enfant - il ne se comporte pas mal. Cela signifie simplement que le parent n'a pas encore organisé l'enterrement approprié pour son enfant.
Ken Williams
19

Le processus zombie (en fait, ils sont appelés <defunct>) n'est pas vraiment un processus. C'est seulement une entrée dans la table de processus, ainsi le processus parent peut faire wait()appel systémique .

Vous ne devriez pas vous inquiéter pour eux. Ils n'occupent aucune ressource, ils disparaîtront également lorsque leur parent fera appel wait()à la mort du parent.

vartec
la source
9

Cependant, il existe déjà une réponse acceptée: vous POUVEZ tuer le processus zombie. Attachez avec le débogueur au processus parent et appelez la fonction waitpid. Exemple: - supposons que le parent ait PID = 100, le processus zombie a PID = 200

$ gdb -p 100
(gdb) call waitpid(200, 0, 0)
(gdb) quit
ondra
la source
Intéressant. Je vais essayer ça.
ewwhite
8

Un processus zombie ne dispose d'aucune ressource, à l'exception de l'entrée dans l'arbre de processus. Cela se produit lorsqu'un processus est terminé, mais le processus parent ne l'a pas encore exploité (c'est-à-dire waitédité dessus).

Vous pouvez essayer de forcer le parent à le faire si vous le souhaitez en lui envoyant un SIGCHLD ( kill -20), mais rien ne garantit que le parent l'honorera.

Vous les verrez souvent pendant de courtes périodes (par exemple, lorsque vous affichez l’arborescence de processus à l’aide de top) - c’est normal; Dans la tranche de temps séparant la fin d'un processus enfant et son interrogation par le parent, le processus enfant apparaîtra sous la forme d'un zombie.

Si vous voyez des processus zombies qui existent continuellement - ce qui n'est pas normal - il n'y a toujours pas lieu de s'inquiéter - encore une fois, aucune ressource n'étant allouée à un processus mort - cela signifie généralement que l'application est mal écrite par des développeurs médiocres.

Le seul moment où vous devriez être concerné par les processus zombies est lorsque vous en voyez beaucoup, par exemple, si la même application de merde mentionnée ci-dessus est placée sous charge.

Je travaille dans de très mauvais développeurs. J'ai donc le privilège de gérer de tels problèmes et d'apprendre toutes sortes de choses inutiles en le faisant. En fait, mon équipe a souvent recours à des scripts shell de merde écrits par des développeurs de merde dans des interviews. Si le candidat peut affirmer que le script est vraiment nul et nous expliquer pourquoi c'est merdique, il a un bon pied dans la porte.

Xerxes
la source
0

En ce qui concerne le fusil de chasse virtuel ...

$ shoot <pid>
#! / bin / sh
victime = `ps -e -o pid, ppid | egrep "^ \ s * $ 1 \ b" | awk '{print $ 2}' `
victime \ _name = `ps -e -o pid, cmd | egrep "^ \ s * $ {victime} \ b" | tête -n 1 | awk '{print $ 2}' `
#kill $ {victime}
echo "Killed $ {victim_name}."

Et rappelez-vous: toujours leur tirer dans la tête.

drybjed
la source
Je suis désolé, mais pour l’instant, ce script a une faute de frappe "nom_propriété" et va tuer le parent du PID donné sur $ 1, en tout cas il considère si le PID est le seul zombie ou s’il a des frères et sœurs, tue le père et avec tout cela la famille périra.
Marc Riera
-1

Un processus zombie est un processus qui a fini de s'exécuter, mais qui est toujours répertorié dans la table des processus.

kill -9 [nom de processus parent] la posera avec un parti pris extrême.

Alan
la source
kill -9 ne tuera pas un processus zombie - c'est une des raisons pour lesquelles ils s'appellent zombies. Un "processus" de zombie ne disparaîtra pas avant que son code de retour ne soit récupéré par un processus parent.
Mei
3
Non, kill -9 sur PARENT va tuer le parent, ce qui initialisation avec son parent, qui WILL récolter le code de retour de l'enfant.
Alan