Y a-t-il un moyen de tuer un processus de zombie? J'ai essayé appeler Quitter code> pour tuer le processus et même envoyer un signal
sigint code> au processus, mais il semble que rien ne puisse le tuer. Je programmment pour Linux. P>
6 Réponses :
Si je me rappelle correctement, tuer le parent d'un processus de zombie permettra au processus de zombie de mourir. P>
Utilisez PS FAUx CODE> Pour obtenir un bel arbre hiérarchique de vos processus de course montrant les relations parent / enfant. P>
Cela lui permet d'être récolté par init code>.
Un processus zombie est un identifiant de processus (et l'état de terminaison associées et les informations d'utilisation des ressources) qui n'a pas encore été attendu par son processus parent. Les seuls moyens de l'éliminer sont d'obtenir son parent à attendre qu'il (parfois cela peut être réalisé en envoyant Modifier strong> Une autre façon, si vous êtes désespérés et ne veulent pas tuer le parent, est de joindre au parent avec gdb et appeler la force SIGCHLD code> pour le parent manuellement si le parent était juste buggy et avait une condition de course où il a manqué la chance d'attendre), mais en général vous êtes hors de la chance, sauf si vous résiliez force le parent. p>
waitpid code> sur l'enfant zombie. p>
voir Unix-FAQs "Comment Est-ce que je me débarrasse des processus zombies qui persévèrent? "
Vous ne pouvez pas tuer des zombies, comme ils sont déjà morts. Mais si vous avez trop de zombies, tuez le processus parent ou le service de redémarrage. P>
Vous pouvez essayer de tuer le processus de zombie à l'aide de son PID P>
kill -9 pid
Non seulement il ne garantit pas de tuer un processus de zombie. kill -9 code> ne peut jamais b> tuer un processus de zombie.
Les processus zombies sont déjà morts, ils ne peuvent donc pas être tués, ils ne peuvent être émergés que, ce qui doit être fait par leur processus parent via attendre * () code>. Ceci est généralement appelé "code> idiom code> idiom, dans le gestionnaire de signal pour
sigchld code>:
Je suis arrivé à utiliser zombie code>,
mort code>,
tué code> et
enfant moissonneur code> dans cette réponse :)
Ce code est incorrect. Si vous mettez cela dans votre gestionnaire code> sigchld code>, vous risquez de bloquer et de ne jamais revenir.
@R ..: Vous êtes censé utiliser l'un des variantes code> supportant
wnohang code>
Vous pouvez également avoir le processus de parent ignorer l'état de l'enfant via le signal (sigchld, sig_ign) code>. Le processus d'enfant disparaît (ne laisse aucun zombie) dès qu'il sortit parce que le parent a enregistré un manque d'intérêt dans le bien-être de ses enfants.
ou p>
serait peut-être le travail, bu tlike tout le monde dit d'autre, il attend le parent à l'appel kill -17 ZOMBIE_PID code> p>
kill -SIGCHLD ZOMBIE_PID code> p>
wait () code> donc à moins que les matrices mères sans récolte, et il a obtenu coincé là pour une raison quelconque, vous ne pourriez pas veulent le tuer. p>
Mais je pense que c'est faux, vous devrez peut-être envoyer cela au parent, idk
Voici un script que j'ai créé pour tuer tous les processus zombies. Il utilise le débogueur GDB pour joindre au processus parent et envoyer un Patient pour tuer le processus de zombie. Cela quittera le parent en direct et ne tuera que le zombie.
Le débogueur GDB devra être installé et vous devrez être connecté avec des autorisations pour joindre à un processus. Ceci a été testé sur Centos 6.3. P>
#!/bin/bash ################################################################## # Script: Zombie Slayer # Author: Mitch Milner # Date: 03/13/2013 ---> A good day to slay zombies # # Requirements: yum install gdb # permissions to attach to the parent process # # This script works by using a debugger to # attach to the parent process and then issuing # a waitpid to the dead zombie. This will not kill # the living parent process. ################################################################## clear # Wait for user input to proceed, give user a chance to cancel script echo "***********************************************************" echo -e "This script will terminate all zombie process." echo -e "Press [ENTER] to continue or [CTRL] + C to cancel:" echo "***********************************************************" read cmd_string echo -e "\n" # initialize variables intcount=0 lastparentid=0 # remove old gdb command file rm -f /tmp/zombie_slayer.txt # create the gdb command file echo "***********************************************************" echo "Creating command file..." echo "***********************************************************" ps -e -o ppid,pid,stat,command | grep Z | sort | while read LINE; do intcount=$((intcount+1)) parentid=`echo $LINE | awk '{print $1}'` zombieid=`echo $LINE | awk '{print $2}'` verifyzombie=`echo $LINE | awk '{print $3}'` # make sure this is a zombie file and we are not getting a Z from # the command field of the ps -e -o ppid,pid,stat,command if [ "$verifyzombie" == "Z" ] then if [ "$parentid" != "$lastparentid" ] then if [ "$lastparentid" != "0" ] then echo "detach" >> /tmp/zombie_slayer.txt fi echo "attach $parentid" >> /tmp/zombie_slayer.txt fi echo "call waitpid ($zombieid,0,0)" >> /tmp/zombie_slayer.txt echo "Logging: Parent: $parentid Zombie: $zombieid" lastparentid=$parentid fi done if [ "$lastparentid" != "0" ] then echo "detach" >> /tmp/zombie_slayer.txt fi # Slay the zombies with gdb and the created command file echo -e "\n\n" echo "***********************************************************" echo "Slaying zombie processes..." echo "***********************************************************" gdb -batch -x /tmp/zombie_slayer.txt echo -e "\n\n" echo "***********************************************************" echo "Script complete." echo "***********************************************************"
N'a pas exécuté sur Ubuntu 14.04: Avertissement: /tmp/zombie_slayer.txt: Aucun fichier ou répertoire de ce type code>.
Oh, je l'avais oublié de faire la plaisanterie évidente: la façon de tuer un zombie est un shoot dans la tête.
quand tueras PID échouer?