Während der Überwachung eines Linux-Systems mit dem top-Befehl können Sie in der Zeile 'Tasks' einen Eintrag wie 1 Zombie finden.
top - 16:03:19 up 7:09, 1 user, load average: 2.24, 2.21, 2.29
Tasks: 392 total, 1 running, 390 sleeping, 0 stopped, 1 zombie
...
Was ist dieser 'Zombie' und welche Auswirkungen hat er auf das System? In diesem Artikel werden wir die Identität von Zombie-Prozessen erläutern und beschreiben, wie man sie identifizieren und lösen kann.
Was sind Zombie-Prozesse? 🧟
Um es einfach zu verstehen, lassen Sie uns die Lebenszyklen von Prozessen betrachten.
-
Geburt (Fork): Der Elternprozess (Parent Process) erstellt einen Kindprozess (Child Process) (
fork()). -
Ausführung (Exec): Der Kindprozess führt seine Aufgaben aus.
-
Beendigung (Exit): Der Kindprozess schließt seine Aufgaben ab und beendet sich (
exit()). -
Ernte (Wait): Wenn der Kindprozess beendet wird, hinterlässt das Betriebssystem (Kernel) Informationen über die PID und den Beendigungsstatus des Prozesses in der Prozesstabelle. Dann sendet es ein
SIGCHLD-Signal (Kindprozess beendet) an den Elternprozess. -
Der Elternprozess muss dieses Signal empfangen und den
wait()-Systemaufruf aufrufen, um die Beendigungsstatusinformationen des Kindes "einzuholen". Sobald diese Informationen abgeholt wurden, entfernt der Kernel den Eintrag des Kindes vollständig aus der Prozesstabelle.
Zombie-Prozesse sind Prozesse, die sich genau zwischen dem 4. und 5. Schritt befinden. Das bedeutet, dass der Kindprozess die Ausführung abgeschlossen hat und beendet ist, aber der Elternprozess noch nicht wait() aufgerufen hat, um den Beendigungsstatus einzuholen.
Wie der Name schon sagt, ist dieser Prozess tot (nicht in Ausführung). Daher verbraucht er keine Systemressourcen wie CPU oder Speicher.
Warum sind Zombie-Prozesse ein Problem?
Zombie-Prozesse verbrauchen selbst kaum Systemressourcen, belegen jedoch einen Slot in der Prozesstabelle (PID).
Wenn weiterhin Zombie-Prozesse aufgrund eines Bugs im Elternprozess angesammelt werden und nicht aufgeräumt werden, könnte die Anzahl der PIDs, die das System zuweisen kann (Maximalwert), erreicht werden. In diesem Fall kann das System keine neuen Prozesse mehr erstellen, was zu schwerwiegenden Störungen führen kann. Es ist nicht ungewöhnlich, 1-2 Zombies in top zu sehen, aber wenn diese Zahl weiterhin steigt, ist Handlungsbedarf gegeben.
Wie man Zombie-Prozesse überprüft und identifiziert
Der top-Befehl zeigt nur die _Anzahl_ der Zombies an. Um herauszufinden, welcher Prozess im Zombie-Zustand ist und wer dessen Eltern ist, muss der ps-Befehl verwendet werden.
Am einfachsten finden Sie die Prozesse, die im STAT-Feld des ps-Befehls mit 'Z' gekennzeichnet sind.
# Alle Prozesse im System auflisten und nach 'Z' (Zombie) filtern
ps -elf | grep ' Z '
# Oder verwenden Sie die 'aux'-Option (8. Spalte ($8) ist der Status (STAT))
ps aux | awk '$8=="Z"'
Beispielausgabe:
# ps -elf | grep ' Z '
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
0 Z user 5021 5000 0 80 0 - 0 exit 15:30 ? 00:00:00 [defunct]
Wichtige Informationen aus dem obigen Beispiel sind:
-
S (Zustand):
Z(zeigt Zombie-Zustand an) -
PID:
5021(dies ist die PID des Zombie-Prozesses) -
PPID:
5000(dies ist die PID des Elternprozesses, der nicht geerntet hat) -
CMD:
[defunct](zeigt an, dass er beendet, aber nicht aufgeräumt wurde)
Lösungsmethoden für Zombie-Prozesse
Die wichtigste Information ist, dass Zombie-Prozesse nicht mit dem kill-Befehl beendet werden können.
kill -9 5021(Zombie-PID aus dem obigen Beispiel)
Der obige Befehl funktioniert nicht, weil der Zombie bereits "tot" ist. Es gibt kein Subjekt, das das kill-Signal behandeln kann.
Die einzige Möglichkeit, einen Zombie-Prozess zu beheben, besteht darin, dass der Elternprozess wait() aufruft.
Schritt 1: Signal an den Elternprozess senden (empfohlen)
Zuallererst sollten Sie versuchen, das SIGCHLD-Signal manuell an den Elternprozess (PPID) zu senden, um den Status des Kindes zu überprüfen.
# SIGCHLD-Signal an den Eltern-PID (5000) senden
kill -s SIGCHLD 5000
Dies informiert den Elternprozess darüber: "Einer deiner Kindprozesse ist beendet worden, schau nach!" Ein normal programmiertes Elternteil sollte dieses Signal erhalten und den Zombie ernten, um ihn zu bereinigen.
Schritt 2: Elternprozess gewaltsam beenden (letztes Mittel)
Wenn Schritt 1 nicht funktioniert, bedeutet dies, dass der Elternprozess (PPID 5000) selbst gestoppt ist oder dass es einen schwerwiegenden Fehler in der Logik beim Aufrufen von wait() gibt.
In diesem Fall ist das gewaltsame Beenden des Elternprozesses die einzige Lösung.
# Elternprozess (PPID 5000) beenden
kill 5000
# Wenn es nicht beendet wird, gewaltsam beenden
kill -9 5000
Warum wird es gelöst, wenn der Elternprozess getötet wird?
In Linux, wenn der Elternprozess stirbt, werden seine Kindprozesse (Waisenprozesse) automatisch von dem init-Prozess (PID 1) oder systemd adoptiert. Der init-Prozess ist so konzipiert, dass er regelmäßig den Status der Kinder überprüft und beendete Kinder (einschließlich Zombies) sofort erntet.
Daher wird der problematische Elternprozess (PPID 5000) getötet, und der Zombie (PID 5021) wird ein neues Kind von init, und init wird sofort den Zombie aufräumen.
⚠️ Achtung: Bevor Sie den Elternprozess beenden, sollten Sie mit dem Befehl
ps -p 5000(Eltern-PID) überprüfen, ob dieser Prozess nicht ein wichtiger Dienst im System (z. B. DB, Webserver usw.) ist. Das gewaltsame Beenden eines wichtigen Dienstes kann zu erheblichen Störungen führen.
Zusammenfassung
-
Zombie-Prozesse sind Überreste in der Prozesstabelle von Prozessen, die abgeschlossen sind, aber deren Eltern den Beendigungsstatus nicht geerntet haben.
-
Sie verbrauchen keine Ressourcen, belegen jedoch die PID, und wenn sie sich übermäßig anhäufen, können sie Systemstörungen verursachen.
-
Sie können Zombies (PID) und deren Eltern (PPID) mit dem Befehl
ps -elf | grep ' Z 'finden. -
Die Lösung konzentriert sich auf den Elternprozess (PPID), nicht auf den Zombie.
-
kill -s SIGCHLD <ElternPID>(empfohlen) -
kill <ElternPID>(letztes Mittel)
-
Es sind keine Kommentare vorhanden.