web-dev-qa-db-de.com

Wie man Zombie-Prozess tötet

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]
160
MOHAMED

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}')
222
William Pursell

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 }')
65
krishna murti

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 :)

33
Mohammad Rafiee

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.

24
Sergio

Ich habe es versucht

kill -9 $(ps -A -ostat,ppid | grep -e '[zZ]'| awk '{ print $2 }')

und es funktioniert bei mir.

19
Jeoffrey