So finden und beenden Sie einen Zombie-Prozess unter Linux

Ein Zombie ist eine Kreatur, die ein Mensch war und gestorben ist, aber irgendwie aufgrund eines Virus oder aus irgendeinem Grund wieder aufgewacht ist. Es ist bereits tot, aber es geht und bewegt sich. Dies ist das Konzept eines Zombies, das in Filmen und Romanen beschrieben wird. Auf die gleiche Weise ist unter Linux ein Zombie-Prozess ein Prozess, der als „defunct“ aus dem System entfernt wurde, aber immer noch irgendwie im Systemspeicher läuft und als Zombie-Prozess bezeichnet wird. Bis ein untergeordneter Prozess aus einer Prozesstabelle entfernt wird, verwandelt er sich zunächst in einen Zombie.

Ein Prozess im beendeten Zustand ist eine andere Bezeichnung dafür. Es wird mithilfe seines übergeordneten Prozesses aus dem Speicher gelöscht. Wenn der übergeordnete Prozess nicht über die Änderung informiert wird, wird der untergeordnete Prozess zum Zombie-Prozess und erhält kein Beendigungssignal, sodass er den Speicher verlassen kann. Wenn unter Linux ein Prozess aus dem Speicher entfernt wird, wird sein übergeordneter Prozess über die Entfernung informiert. Dieser Prozess bleibt im Speicher, bis er seinen übergeordneten Prozess benachrichtigt.

Das bedeutet, dass der tote Prozess nicht sofort aus dem Speicher entfernt wird, sondern im Systemspeicher verbleibt und somit zu einem Zombie-Prozess wird. Um einen Zombie-Prozess zu entfernen, ruft der übergeordnete Prozess die Funktion wait() auf. Sobald die Funktion wait() aufgerufen wird, wird der Zombie-Prozess vollständig aus dem System entfernt.

Einen Zombie-Prozess töten

Bevor wir dazu übergehen, den Zombie-Prozess zu beenden, besprechen wir zunächst die Risiken des Zombie-Prozesses und die Ursachen für den Zombie-Prozess. Außerdem werden wir mehr über den Zombie-Prozess erfahren, um den Tötungsprozess einfacher zu verstehen.

Was ist die Ursache des Zombie-Prozesses?

Der Zombie-Prozess kann zwei Hauptursachen haben. Der erste Fall ist der, bei dem der übergeordnete Prozess die Funktion „wait()“ nicht aufrufen kann, wenn der untergeordnete Erstellungsprozess ausgeführt wird, was dazu führt, dass SIGCHLD ignoriert wird. Dies kann den Zombie-Prozess verursachen. Im zweiten Fall kann die andere Anwendung die Ausführung des übergeordneten Prozesses aufgrund fehlerhafter Codierung oder schädlicher Inhalte beeinträchtigen.

Mit anderen Worten können wir sagen, dass der Zombie-Prozess verursacht wird, wenn der übergeordnete Prozess die Statusänderungen des untergeordneten Prozesses ignoriert oder den Status des untergeordneten Prozesses nicht überprüfen kann. Wenn der untergeordnete Prozess endet, wird die Leiterplatte nicht gelöscht.

Stellt der Zombie-Prozess ein Risiko dar?

Der Zombie-Prozess stellt kein Risiko dar, er belegt lediglich einen Teil des Speichers im System. Die Prozesstabelle ist klein, aber die ID der Tabelle, in der der Zombie-Prozess gespeichert ist, kann erst verwendet werden, wenn sie vom Zombie-Prozess freigegeben wird. Wenn jedoch viele Zombie-Prozesse den Speicherort reservieren und kein Speicherplatz mehr für die Ausführung anderer Prozesse übrig bleibt, wird die Ausführung anderer Prozesse schwierig.

Einen Zombie-Prozess finden

Bevor der Zombie-Prozess beendet wird, ist es notwendig, sie zu finden. Um den Zombie-Prozess zu finden, führen wir den folgenden Befehl im Terminal aus:

linux@linux-VirtualBox:~$ ps aux | egrep „Z|defunct“

Im obigen Befehl steht „ps“ für den Prozessstatus. Er wird verwendet, um den Status des Prozesses anzuzeigen, der im System zusammen mit dem ps-Befehl ausgeführt wird. Wir haben das Flag aux übergeben, in dem „a“ die Details aller zugehörigen Prozesse im Terminal angibt, „u“ die Prozesse angibt, die sich in der Benutzerliste befinden, und „x“ die Prozesse angibt, die nicht vom Terminal ausgeführt werden. Zusammenfassend können wir sagen, dass es zum Ausdrucken aller laufenden Prozesse verwendet wird, die im Speicher gespeichert sind.

Die zweite übergebene Option „egrep“ ist ein Verarbeitungstool, das zum Abrufen der Ausdrücke oder Muster an einem angegebenen Speicherort verwendet wird. Zuletzt haben wir das Schlüsselwort „Z|defunct“ übergeben, das den Zombie-Prozess angibt, der in den Speicher geholt werden soll. Wenn wir den Befehl ausführen, erhalten wir die folgende Ausgabe, die den Zombie-Prozess im System zusammen mit seiner „PID“ zeigt.

Ausgabe:

BENUTZER-PID %CPU %MEM VSZ RSS TTY STAT STARTZEITBEFEHL
Linux 33819 0,0 0,0 18008 724 Punkte/0 S+ 20:22 0:00 grep -E –color=auto Z|defunct

Zombie-Prozesse sind bereits tote Prozesse, aber der übergeordnete Prozess kann seinen Status nicht lesen und kann nicht aus dem Speicher freigegeben werden. Der tote Prozess kann also nicht beendet werden. Wir können nur dafür sorgen, dass der übergeordnete Prozess den untergeordneten Status lesen kann, damit er ausgeführt und aus der Prozesstabelle entfernt werden kann. Dazu führen wir den unten genannten Befehl aus.

linux@linux-VirtualBox:~$ ps –o ppid= -p 33819

Im obigen Befehl haben wir versucht, die übergeordnete ID des Zombie-Prozesses abzurufen. Nachdem wir die übergeordnete ID erhalten haben, führen wir den folgenden Befehl aus, um den Zombie-Prozess zu beenden, indem wir SIGCHLD an den übergeordneten Prozess senden, der es dem übergeordneten Prozess ermöglicht, den untergeordneten Status zu lesen:

linux@linux-VirtualBox:~$ kill –s SIGCHLD Parent_PID

Im obigen Befehl übergeben wir das Signal an die übergeordnete ID, um den Zombie-Prozess der an sie übergebenen übergeordneten ID abzubrechen. Nachdem der obige Befehl ausgeführt wurde, wechselt er einfach zur nächsten Zeile, ohne eine Ausgabe auf dem Terminal zu drucken, falls keine übergeordnete ID vorhanden ist. Um zu überprüfen, ob der Zombie-Prozess beendet wurde oder nicht, können Sie den Befehl ausführen, den wir bereits ausgeführt haben, um den Zombie-Prozess zu finden.

Versuchen wir einen anderen Weg, den Zombie-Prozess zu beenden, indem wir den übergeordneten Prozess selbst beenden. Dies ist die effizientere Methode, den Zombie-Prozess zu beenden, da dadurch der gesamte Prozess vollständig entfernt wird und der Zombie nicht erneut auftauchen kann. Dazu führen wir den unten gezeigten Befehl aus:

linux@linux-VirtualBox:~$ kill -9 Parent_PID

Nachdem wir den obigen Befehl ausgeführt haben, erlauben wir dem System, den übergeordneten Prozess abzubrechen.

Abschluss

Wir haben kurz den Zombie-Prozess sowie die Ursachen und die Vorgehensweise zum Beenden dieser Prozesse besprochen. Bevor wir zu unserem Tötungsprozess übergingen, versuchten wir, die Gründe für ihre Ursache zu erklären und auch die Möglichkeiten, sie mithilfe einfacher Befehle zu identifizieren.

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Nach oben scrollen