web-dev-qa-db-fra.com

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

Fusils de chasse virtuels?

38
jldugger

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 socket

  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, etc.

En général, 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, RETIREZ LE BINAIRE parce que le programme se comporte mal!

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

17
Severe_admin

processus Zombie (en fait maintenant ils s'appellent <defunct>) N'est pas vraiment un processus. Ce n'est qu'une entrée dans la table de processus, donc le processus parent peut faire wait() syscall .

Vous ne devriez pas vous en soucier. Ils n'occupent aucune ressource, ils disparaissent non plus lorsque leur parent appelle wait() lorsque le parent lui-même meurt.

20
vartec

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

$ gdb -p 100
(gdb) call waitpid(200, 0, 0)
(gdb) quit
11
ondra

C'est un processus qui a été complètement désalloué mais qui existe toujours dans la table de processus. contraste avec un processus orphelin, dont le parent est décédé mais est toujours en cours d'exécution.

Voicicertainsconseils pour se débarrasser d'eux.

10
nedm

Un processus zombie n'a aucune ressource qui lui soit allouée, à part l'entrée dans l'arborescence des processus. Cela se produit lorsqu'un processus se termine, mais le processus parent ne l'a pas encore récolté, (c'est-à-dire waited dessus).

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

Vous les verrez souvent pendant de courtes périodes (par exemple lorsque vous visualisez l'arborescence de processus en haut) - c'est normal; Dans l'intervalle de temps entre la fin d'un processus enfant et le sondage du parent, le processus enfant apparaîtra comme 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 car il n'y a pas de ressources allouées à un processus mort - cela signifie généralement que l'application est mal écrite par des développeurs merdiques.

Le seul moment où vous devriez vous préoccuper des processus zombies, c'est quand vous en voyez beaucoup, par exemple si la même application merdique mentionnée ci-dessus est mise sous charge.

Nous avons beaucoup de développeurs pourris où je travaille, et j'ai donc le privilège de traiter 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 merdiques écrits par des développeurs merdiques lors d'entretiens - si le candidat peut choisir que le script est vraiment merdique et nous dire pourquoi il est merdique, il a un bon pied dans la porte.

8
Xerxes

Quant au fusil de chasse virtuel ...

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

Et rappelez-vous: tirez-les toujours dans la tête.

0
drybjed