Ich habe mein Programm im Vordergrund gestartet (ein Daemon-Programm) und es dann mit kill -9
beendet, aber es ist noch ein Zombie übrig und ich kann es nicht mit kill -9
beenden. Wie töte ich einen Zombie-Prozess?
Wenn der Zombie ein toter Prozess ist (bereits getötet), wie entferne ich ihn aus der Ausgabe von ps aux
?
[email protected]:~# anyprogramd &
[email protected]:~# ps aux | grep anyprogram
1163 root 2552 S anyprogramd
1167 root 2552 S anyprogramd
1169 root 2552 S anyprogramd
1170 root 2552 S anyprogramd
10101 root 944 S grep anyprogram
[email protected]:~# pidof anyprogramd
1170 1169 1167 1163
[email protected]:~# kill -9 1170 1169 1167 1163
[email protected]:~# ps aux |grep anyprogram
1163 root 0 Z [cwmpd]
[email protected]:~# kill -9 1163
[email protected]:~# ps aux |grep anyprogram
1163 root 0 Z [cwmpd]
Ein Zombie ist bereits tot, also kannst du ihn nicht töten. Um einen Zombie zu bereinigen, muss er von seinem Elternteil gewartet werden. Das Töten des Elternteils sollte also funktionieren, um den Zombie zu eliminieren. (Nachdem der Elternteil gestorben ist, wird der Zombie von PID 1 geerbt, der darauf wartet und seinen Eintrag in der Prozesstabelle löscht.) Wenn Ihr Dämon Kinder hervorbringt, die zu Zombies werden, haben Sie einen Fehler. Ihr Daemon sollte bemerken, wann seine Kinder sterben und wait
auf ihnen, um ihren Exit-Status zu bestimmen.
Ein Beispiel, wie Sie ein Signal an jeden Prozess senden können, der das Elternteil eines Zombies ist (beachten Sie, dass dies extrem grob ist und Prozesse töten kann, die Sie nicht beabsichtigen. Ich empfehle nicht, diese Art von Vorschlaghammer zu verwenden):
kill $(ps -A -ostat,ppid | awk '/[zZ]/ && !a[$2]++ {print $2}')
Sie können einen Zombie-Prozess bereinigen, indem Sie den übergeordneten Prozess mit dem folgenden Befehl beenden:
kill -HUP $(ps -A -ostat,ppid | grep -e '[zZ]'| awk '{ print $2 }')
Ich habe es 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 :)
Fand es unter http://www.linuxquestions.org/questions/suse-novell-60/howto-kill-defunct-processes-574612/
2) Hier ein toller Tipp von einem anderen Benutzer (Thxs Bill Dandreta): Manchmal
kill -9 <pid>
bricht keinen Prozess ab. Lauf
ps -xal
das vierte 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 Wirkung.
kill -9 31706
entfernt die Zombies.
Ich habe es versucht
kill -9 $(ps -A -ostat,ppid | grep -e '[zZ]'| awk '{ print $2 }')
und es funktioniert bei mir.