Was ist ein Zombie-Prozess und wie kann ich ihn beenden?


Antworten:


17

Oh Gott! Nein nein Nein. Verwende nicht kill -9.

Es gibt dem Prozess keine Chance, sauber zu werden:

  1. Steckdosenverbindungen abschalten

  2. bereinigen Sie temporäre Dateien

  3. informieren Sie seine Kinder, dass es weggeht

  4. Setzen Sie die Anschlusseigenschaften zurück und so weiter und so fort.

Senden Sie im Allgemeinen 15 und warten Sie ein oder zwei Sekunden. Wenn dies nicht funktioniert, senden Sie 2 und wenn dies nicht funktioniert, senden Sie 1. Wenn dies nicht funktioniert, ENTFERNEN SIE DEN BINARY, da sich das Programm schlecht verhält!

Verwende nicht kill -9. Nehmen Sie den Mähdrescher nicht heraus, nur um den Blumentopf aufzuräumen.


13
kill -9 tötet keine Zombies. Du musst ihre Eltern töten, sieh dir pstree an.
LapTop006

3
@ LapTop006: In diesem Fall sind sie eher wie Vampire. Töte den Hauptvampir, um die Invasion zu stoppen.
Amphetamachine

2
Diese Antwort ist in jeder Hinsicht falsch. Der Vorgang ist abgeschlossen. Es hat bereits seine Verbindungen getrennt, temporäre Dateien aufgeräumt usw. usw. Es gibt keinen aktuellen Prozess mehr, nur einen Eintrag in der Prozesstabelle. Entfernen Sie nicht die untergeordnete Binärdatei - sie verhält sich nicht schlecht. Das bedeutet nur, dass die Eltern noch kein richtiges Begräbnis für ihr Kind abgehalten haben.
Ken Williams

19

Zombie-Prozess (eigentlich heißen sie jetzt <defunct>) ist eigentlich kein Prozess. Es ist nur ein Eintrag in der Prozesstabelle, sodass der übergeordnete Prozess wait()Syscall ausführen kann .

Sie sollten sich keine Sorgen um sie machen. Sie belegen keine Ressourcen, sie verschwinden auch, wenn der Elternteil anruft, wait()wenn der Elternteil selbst stirbt.



9

Es gibt jedoch bereits eine akzeptierte Antwort: Sie KÖNNEN den Zombie-Prozess beenden. Verbinden Sie sich mit dem Debugger mit dem übergeordneten Prozess und rufen Sie die Funktion waitpid auf. ZB: - Nehmen wir an, dass der Elternteil PID = 100 hat, der Zombie-Prozess PID = 200

$ gdb -p 100
(gdb) call waitpid(200, 0, 0)
(gdb) quit

Interessant. Ich werde das versuchen.
ewwhite

8

Einem Zombie-Prozess sind keine anderen Ressourcen als der Eintrag im Prozessbaum zugeordnet. Dies geschieht, wenn ein Prozess abgeschlossen ist, der übergeordnete Prozess ihn jedoch noch nicht geerntet (dh waitbearbeitet) hat.

Sie können versuchen, das übergeordnete Element dazu zu zwingen, indem Sie ein SIGCHLD ( kill -20) an das übergeordnete Element senden. Es gibt jedoch keine Garantie dafür, dass das übergeordnete Element dies einhält.

Sie werden sie häufig für kurze Zeiträume sehen (z. B. beim Anzeigen des Prozessbaums mit top) - dies ist normal. In der Zeitspanne zwischen dem Abschluss eines untergeordneten Prozesses und dem Abstimmen des übergeordneten Prozesses wird der untergeordnete Prozess als Zombie angezeigt.

Wenn Sie jedoch Zombie-Prozesse sehen, die ständig existieren - was nicht normal ist -, müssen Sie sich immer noch keine Sorgen machen - auch wenn einem toten Prozess keine Ressourcen zugewiesen wurden -, bedeutet dies im Allgemeinen, dass die Anwendung von beschissenen Entwicklern schlecht geschrieben wurde.

Das einzige Mal, dass Sie von Zombie-Prozessen betroffen sein sollten, ist, wenn Sie viele, viele von ihnen sehen, zum Beispiel, wenn die gleiche beschissene Anwendung, die oben erwähnt wurde, unter Last gesetzt wird.

Wir haben eine Menge beschissener Entwickler, bei denen ich arbeite, und so habe ich das Privileg, mit solchen Problemen umzugehen und dabei alle möglichen nutzlosen Dinge zu lernen. In der Tat - mein Team greift häufig auf die beschissenen Shell-Skripte zurück, die von beschissenen Entwicklern in Interviews geschrieben wurden -, wenn der Kandidat herausfinden kann, dass das Skript tatsächlich beschissen ist, und uns sagt, warum es beschissen ist, hat er einen guten Fuß in der Tür.


0

Wie für die virtuelle Schrotflinte ...

$ shoot <pid>
#! / bin / sh
victim = `ps -e -o pid, ppid | egrep "^ \ s * $ 1 \ b" | awk '{print $ 2}' `
Opfer \ _name = `ps -e -o pid, cmd | egrep "^ \ s * $ {victim} \ b" | head -n 1 | awk '{print $ 2}' `
#kill $ {victim}
echo "$ {victim_name} getötet."

Und denken Sie daran: Schießen Sie immer in den Kopf.


Es tut mir leid, aber für die Aufzeichnung hat dieses Skript einen Tippfehler "victim_name" und wird den Elternteil der PID töten, die auf $ 1 angegeben wurde. Auf jeden Fall wird überlegt, ob PID der einzige Zombie ist oder ob er einige Geschwister hat tötet den Vater und mit ihm wird die ganze Familie zugrunde gehen.
Marc Riera

-1

Ein Zombie-Prozess ist ein Prozess, dessen Ausführung abgeschlossen ist, der jedoch weiterhin in der Prozesstabelle aufgeführt ist.

kill -9 [übergeordneter Prozessname] legt es mit extremen Vorurteilen ab.


kill -9 tötet keinen Zombie-Prozess - das ist einer der Gründe, warum sie Zombies genannt werden. Ein "Prozess" eines Zombies verschwindet erst, wenn sein Rückkehrcode von einem übergeordneten Prozess abgerufen wird.
Mei

3
Nein, kill -9 auf das Mutter die Eltern töten, init seinen Eltern zu machen, die WILL die Rückgabe des Kindes Code ernten.
Alan
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.