Wie man den Zombie-Prozess tötet

183

Ich habe mein Programm im Vordergrund gestartet (ein Daemon-Programm) und es dann mit getötet kill -9, aber es bleibt ein Zombie übrig und ich kann es nicht mit töten kill -9. 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?

root@OpenWrt:~# anyprogramd &
root@OpenWrt:~# 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
root@OpenWrt:~# pidof anyprogramd
1170 1169 1167 1163
root@OpenWrt:~# kill -9 1170 1169 1167 1163
root@OpenWrt:~# ps aux |grep anyprogram
 1163 root         0 Z    [anyprogramd]
root@OpenWrt:~# kill -9 1163
root@OpenWrt:~# ps aux |grep anyprogram
 1163 root         0 Z    [anyprogramd]
MOHAMED
quelle
2
Was ps -o ppid 1163sagt das aus? Das heißt, wer ist 1163 Eltern? Das ist der Prozess, der beendet werden muss.
William Pursell

Antworten:

247

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 waitauf ihnen, um ihren Exit-Status zu bestimmen.

Ein Beispiel dafür, wie Sie ein Signal an jeden Prozess senden können, der der 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):

# Don't do this.  Incredibly risky sledge hammer!
kill $(ps -A -ostat,ppid | awk '/[zZ]/ && !a[$2]++ {print $2}')
William Pursell
quelle
1
Wenn der Zombie ein toter Prozess ist (bereits getötet), wie entferne ich ihn aus der Ausgabe von ps aux?
MOHAMED
185
Auf den Zombie muss von seinem Elternteil gewartet werden. Finden Sie die Eltern und finden Sie heraus, warum diese Eltern nicht auf ihre Kinder achten. Reichen Sie dann eine Beschwerde bei den Sozialdiensten ein. ;)
William Pursell
1
Angenommen, Sie haben einen Prozess, der viele Zombies produziert, ist es sinnvoll, die IDs zu "vereinheitlichen":kill $(ps -A -ostat,ppid | awk '/[zZ]/{print $2}' | sort -u)
ankon
2
Normalerweise finden Sie die Eltern in der PPidReihe, wenn Siecat /proc/<pid>/status
Daniel Andrei Mincă
1
Ich habe mir nur vorgestellt, dass Nicht-IT-Leute hierher kommen und dies lesen. Verrückt.
ZitRo
68

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 }')
krishna murti
quelle
6
Dieser Befehl löscht den Zombie aus der Prozesstabelle, tötet den Zombie jedoch nicht. Der Zombie ist bereits tot.
William Pursell
8
Das grepist nicht nötig. ps ... | awk '/[zZ]/{print $2}'
William Pursell
2
AFAICS, dieser Befehl tötet den Zombie nicht, sondern sendet SIGHUP an seinen übergeordneten Prozess (vermutlich wird der übergeordnete Prozess getötet, wenn SIGHUP nicht verarbeitet wird und der Zombie wie in der vorherigen Antwort beschrieben auf init repariert wird). Seien Sie also vorsichtig mit diesem Befehl, er könnte etwas töten, mit dem Sie nicht gerechnet haben ...
Matthijs Kooijman
1
Das hat bei mir nicht funktioniert. Ich habe "kill -HUP processID" und der Prozess ist immer noch als Zombie da
kommradHomer
1
@WilliamPursell Wenn Sie eine Frage beantworten, beschreiben Sie bitte die Konsequenzen der Verwendung der Befehlszeile und deren explizite Vorgehensweise, da alle auf dem Computer ausgeführten Programme beendet werden.
Dalek
39

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

Mohammad Rafiee
quelle
In meinem Fall wurde der Zombie über ein Startskript und ein Programm erstellt, das nicht eindeutig entfernt wurde, also habe ich es gelöscht.
Mohammad Rafiee
1
Hat für mich gearbeitet. Dies funktioniert in bestimmten Fällen, wenn der nicht mehr existierende Prozess durch einen anderen getöteten Prozess ausgelöst wurde.
Eric S. Bullington
2
Ich habe den übergeordneten Prozess überprüft, bevor ich ihn beendet habe. Und ich habe es einfach mit -9 statt -1 getötet: kill -9 {die Eltern-ID}
Ali
Ich musste auch -9 verwenden, um meine anstelle von -1 zu töten
Michael Smith
26

Gefunden 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>

wird keinen Prozess beenden. Lauf

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, 18583Sind Zombies -

kill -9 18581 18582 18583

hat keine Wirkung.

kill -9 31706

entfernt die Zombies.

Sergio
quelle
3
initNun, das hat mich gerade umgebracht , und jetzt kann ich nichts mehr tun und bin gezwungen, neu zu starten. Der Zombie-Prozess ist Java und nimmt 3,4 GB aus 4 GB RAM heraus
Tcll
22

Ich habe es versucht

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

und es funktioniert bei mir.

Jeoffrey
quelle