Ein Zombie ist bereits tot, also kannst du ihn nicht töten. Um einen Zombie aufzuräumen, muss er von seinem Elternteil bedient werden, also sollte das Töten des Elternteils funktionieren, um den Zombie zu eliminieren. (Nach dem Tod des Elternteils wird der Zombie von PID 1 geerbt, die darauf wartet und seinen Eintrag in der Prozesstabelle löscht.) Wenn Ihr Daemon Kinder erzeugt, die zu Zombies werden, haben Sie einen Fehler. Ihr Daemon sollte bemerken, wenn seine Kinder sterben und wait
auf ihnen, um ihren Exit-Status zu bestimmen.
Ein Beispiel dafür, wie Sie ein Signal an jeden Prozess senden könnten, der der Elternprozess eines Zombies ist (beachten Sie, dass dies extrem grob ist und Prozesse töten könnte, die Sie nicht beabsichtigen. Ich empfehle nicht, diese Art von Vorschlaghammer zu verwenden):P>
# Don't do this. Incredibly risky sledge hammer!
kill $(ps -A -ostat,ppid | awk '/[zZ]/ && !a[$2]++ {print $2}')
Ich habe versucht:
ps aux | grep -w Z # returns the zombies pid
ps o ppid {returned pid from previous command} # returns the parent
kill -1 {the parent id from previous command}
das wird funktionieren :)
Gefunden unter http://www.linuxquestions.org/questions/suse-novell-60/howto-kill-defunct-processes-574612/
2) Hier ein toller Tipp von einem anderen Benutzer (danke Bill Dandreta):Manchmal
kill -9 <pid>
wird keinen Prozess beenden. Ausführen
ps -xal
das 4. Feld ist der Elternprozess, töte alle Eltern eines Zombies und der Zombie stirbt!
Beispiel
4 0 18581 31706 17 0 2664 1236 wait S ? 0:00 sh -c /usr/bin/gcc -fomit-frame-pointer -O -mfpmat
4 0 18582 18581 17 0 2064 828 wait S ? 0:00 /usr/i686-pc-linux-gnu/gcc-bin/3.3.6/gcc -fomit-fr
4 0 18583 18582 21 0 6684 3100 - R ? 0:00 /usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.6/cc1 -quie
18581
, 18582
, 18583
sind Zombies -
kill -9 18581 18582 18583
hat keine Auswirkung.
kill -9 31706
entfernt die Zombies.
Sie können einen Zombie-Prozess bereinigen, indem Sie seinen übergeordneten Prozess mit dem folgenden Befehl beenden:
kill -HUP $(ps -A -ostat,ppid | awk '{/[zZ]/{ print $2 }')