Was ist ein Zombie-Prozess unter Linux?
Wenn Sie ein Linux-Benutzer sind, haben Sie möglicherweise Zombie-Prozesse in Ihrer Prozessliste gesehen. Sie können einen Zombie-Prozess nicht töten, weil er bereits tot ist - wie ein echter Zombie.
Zombies sind im Grunde die Überbleibsel von toten Prozessen, die nicht ordnungsgemäß aufgeräumt wurden. Ein Programm, das Zombie-Prozesse erstellt, ist nicht richtig programmiert - Programme dürfen Zombie-Prozesse nicht zulassen.
Bildnachweis: Daniel Hollister auf Flickr (Remixed)
Was ist ein Zombie-Prozess??
Um zu verstehen, was ein Zombie-Prozess ist und was dazu führt, dass Zombie-Prozesse angezeigt werden, müssen Sie ein wenig darüber verstehen, wie Prozesse unter Linux funktionieren.
Wenn ein Prozess unter Linux stirbt, wird er nicht sofort aus dem Arbeitsspeicher entfernt - der Prozessdeskriptor bleibt im Arbeitsspeicher (der Prozessdeskriptor benötigt nur wenig Speicherplatz). Der Status des Prozesses wird zu EXIT_ZOMBIE und der übergeordnete Prozess des Prozesses wird benachrichtigt, dass sein untergeordneter Prozess mit dem SIGCHLD-Signal gestorben ist. Der übergeordnete Prozess soll dann den wait () - Systemaufruf ausführen, um den Beendigungsstatus des toten Prozesses und andere Informationen zu lesen. Dadurch kann der übergeordnete Prozess Informationen aus dem nicht aktiven Prozess abrufen. Nach dem Aufruf von wait () wird der Zombie-Prozess vollständig aus dem Speicher entfernt.
Dies geschieht normalerweise sehr schnell, sodass sich auf Ihrem System keine Zombie-Prozesse ansammeln. Wenn ein übergeordneter Prozess jedoch nicht ordnungsgemäß programmiert ist und nie wait () aufruft, bleiben seine Zombie-Kinder im Speicher, bis sie aufgeräumt werden.
Dienstprogramme wie der GNOME-Systemmonitor oben Befehl und die ps Befehl Anzeige Zombie-Prozesse.
Gefahren von Zombie-Prozessen
Zombie-Prozesse verbrauchen keine Systemressourcen. (Tatsächlich verwendet jeder eine sehr kleine Menge Systemspeicher, um seinen Prozessdeskriptor zu speichern.) Jeder Zombie-Prozess behält jedoch seine Prozess-ID (PID). Linux-Systeme verfügen über eine begrenzte Anzahl von Prozess-IDs - standardmäßig 32767 auf 32-Bit-Systemen. Wenn sich Zombies sehr schnell ansammeln - zum Beispiel, wenn eine falsch programmierte Serversoftware Zombie-Prozesse unter Last erzeugt - wird der gesamte Pool der verfügbaren PIDs schließlich Zombie-Prozessen zugewiesen, wodurch der Start anderer Prozesse verhindert wird.
Einige wenige Zombie-Prozesse sind jedoch kein Problem - obwohl sie auf einen Fehler beim übergeordneten Prozess in Ihrem System hinweisen.
Zombie-Prozesse loswerden
Sie können Zombie-Prozesse nicht töten, da Sie normale Prozesse mit dem SIGKILL-Signal beenden können - Zombie-Prozesse sind bereits tot. Denken Sie daran, dass Sie die Zombie-Prozesse nicht loswerden müssen, wenn Sie nicht viel auf Ihrem System haben - ein paar Zombies sind harmlos. Es gibt jedoch einige Möglichkeiten, Zombie-Prozesse zu beseitigen.
Eine Möglichkeit ist das Senden des SIGCHLD-Signals an den übergeordneten Prozess. Dieses Signal weist den übergeordneten Prozess an, den wait () - Systemaufruf auszuführen und seine Zombie-Kinder zu säubern. Senden Sie das Signal mit töten Befehl, Ersetzen pid im folgenden Befehl mit der PID des übergeordneten Prozesses:
kill -s SIGCHLD pid
Wenn der übergeordnete Prozess jedoch nicht richtig programmiert ist und SIGCHLD-Signale ignoriert, kann dies nicht helfen. Sie müssen den Elternprozess der Zombies beenden oder beenden. Wenn der Prozess, der die Zombies erstellt hat, endet, erbt init die Zombie-Prozesse und wird zu ihrem neuen übergeordneten Element. (init ist der erste Prozess, der beim Booten unter Linux gestartet wurde und der PID 1 zugewiesen wurde.) init führt regelmäßig den wait () -Systemaufruf aus, um seine Zombie-Kinder zu bereinigen, sodass init die Zombies schnell erledigt. Sie können den übergeordneten Prozess nach dem Schließen erneut starten.
Wenn ein übergeordneter Prozess weiterhin Zombies erstellt, sollte dies behoben werden, damit wait () ordnungsgemäß aufgerufen wird, um seine Zombie-Kinder zu ernten. Senden Sie einen Fehlerbericht, wenn ein Programm in Ihrem System ständig Zombies erstellt.