- Zombie-Prozess
-
Ein Zombie ist vor allem in Unix-ähnlichen Betriebssystemen (wie z. B. Linux) ein Prozess, der beendet ist, aber trotzdem noch in der Prozesstabelle auftaucht und geringfügig Systemressourcen belegt. Ein Zombie richtet selbst keinen Schaden an, kann aber auf einen Fehler hinweisen.
Wenn ein Prozess einen neuen Prozess startet (mittels Verzweigung), wird der alte Elternprozess, und der neue Kindprozess genannt. Wenn der Kindprozess beendet wird, kann der Elternprozess vom Betriebssystem erfragen, auf welche Art der Kindprozess beendet wurde: erfolgreich, mit Fehler, abgestürzt, abgebrochen, etc.
Um diese Abfrage zu ermöglichen, bleibt ein Prozess, selbst nachdem er beendet wurde, in der Prozesstabelle stehen, bis der Elternprozess diese Abfrage durchführt - egal ob diese Information gebraucht wird oder nicht. Bis dahin hat der Kindprozess den Zustand Zombie. In diesem Zustand belegt der Prozess selbst keinen Arbeitsspeicher mehr (bis auf den platzmäßig vernachlässigbaren Eintrag in der Prozesstabelle des Kernels) und verbraucht auch keine Rechenzeit, jedoch behält er seine PID, die (noch) nicht für andere Prozesse wieder verwendet werden kann.
Genau genommen sendet der Kernel ein spezielles Signal, nämlich SIGCHLD, an den Elternprozess, sobald eines seiner Kinder beendet wird. Der Handler für dieses Signal ist ein geeigneter Platz, die Abfrage des Status des Kindes durchzuführen, damit es endgültig verschwindet. Geschieht dies nicht oder wird überhaupt kein Handler für SIGCHLD angegeben (in diesem Fall wird das Signal einfach ignoriert), bleibt das Kind im Zombie-Zustand. Der Linux-Kern bietet hier für Prozesse, die am Status ihrer Kinder nicht interessiert sind, eine einfache - wohlgemerkt nicht standardisierte - Methode, Zombies loszuwerden: Gibt ein Prozess explizit an, dass er SIGCHLD ignorieren will (im Gegensatz zum Ignorieren per Default, wenn kein Handler angegeben ist), so löscht Linux die Zombies automatisch, ohne auf eine Status-Abfrage zu warten.
Ein weiterer Spezialfall, der an und für sich unabhängig von Zombies ist, jedoch in Kombination damit auftreten kann, ist wenn der Elternprozess beendet wird. In diesem Fall werden alle seine Kindprozesse „verwaist“ genannt. Die Kindprozesse werden dann per Definition vom Prozess mit der PID 1 "adoptiert" und bekommen diesen als Vaterprozess zugewiesen. (In der klassischen System-V-Bootfolge, die auch heute noch von den meisten Linux-Distributionen verwendet wird, hat der sog. init-Prozess die PID 1. Bei OS X tritt launchd an diese Stelle.) Dies passiert wohlgemerkt für laufende genauso wie für Zombie-Prozesse, deren Eltern nicht mehr existieren.
Der Init-Prozess hat u. a. die Aufgabe, den Beendigungszustand seiner Kinder abzufragen, sobald diese beendet - also in den Zombie-Zustand überführt - werden. Dadurch sorgt er dafür, dass keine überflüssigen Zombies im System herumgeistern. Laufende Prozesse, die von init adoptiert werden, werden dadurch nicht beeinträchtigt - init wartet einfach, bis sie fertig sind, und fragt dann deren Status ab.
Daraus ergeben sich zwei einfache Methoden, unnötige Zombies loszuwerden: Zum einen kann man manuell dem Vaterprozess des Zombies (laut PPID-Angabe in der Prozesstabelle) das Signal SIGCHLD senden, auf der Kommandozeile z.B. mittels
kill -CHLD <PID des Vaterprozesses>
. Reagiert der Vater darauf nicht, so kann man den Vaterprozess beenden, damit das Zombie-Kind vom init-Prozess adoptiert und sofort danach durch Abfrage seines Zustands endgültig gelöscht wird.Wenn ein Prozess seine Kinder oftmals „vergisst“ und zu Zombies werden lässt, besonders wenn er auch auf ein manuelles SIGCHLD nicht reagiert, ist das meistens ein Hinweis auf einen Bug in diesem Programm. Zombies belasten zwar das System kaum, allerdings kann der verursachende Fehler im Vaterprozess unter anderen Umständen, z.B. bei hoher Belastung, weit größere Folgen haben. Sehr viele herumgeisternde Zombies können auch dazu führen, dass dem Kernel die freien PIDs, die er für neue Prozesse braucht, ausgehen. Die PID-Belegung durch Zombies ist u.U. problematischer, als deren minimaler Speicherverbrauch.
Wikimedia Foundation.