Kurz: Dies ist ein kurzer Tipp, um Zombie-Prozesse in Linux zu finden und sie dann zu beenden. Sie lernen auch ein oder zwei Dinge über Prozesse und Zombie-Prozesse.
Bevor Sie etwas über den Zombie-Prozess erfahren, möchte ich mich daran erinnern, was ein Prozess in Linux ist.
In wenigen Worten, a Prozess ist eine laufende Instanz eines Programms in Leistung. Es kann sich um Vordergrund (interaktiver Prozess) oder Hintergrund (nicht interaktiver oder automatischer Prozess) handeln. Es kann sich um einen übergeordneten (Ersteller anderer Prozesse während der Laufzeit) oder einen untergeordneten (von anderen erstellten) Prozess handeln.
Unter Linux, mit Ausnahme des ersten init (oder systemd) Prozesses mit PID 0, hat jeder andere Prozess einen Elternprozess. Prozesse haben auch ihre eigenen untergeordneten Prozesse.
Glauben Sie mir nicht? Verwenden Sie die pstree
Befehl im Terminal, um den Prozessbaum anzuzeigen, um den ‘Stammbaum’ der Prozesse Ihres Systems zu sehen.
Was ist ein Zombie-Prozess in Linux?
Wenn ein Kindprozess stirbt, wird der Elternprozess informiert, damit er einige Aufräumarbeiten durchführen kann, wie zum Beispiel Speicher freigeben usw. Der Kindprozess geht jedoch in den Zombie-Zustand, wenn der Elternprozess seinen Tod nicht bemerkt. Für die Eltern existiert das Kind noch, aber der Kindprozess ist eigentlich tot. Auf diese Weise werden Zombie-Prozesse (auch als veraltete Prozesse bekannt) erstellt und bleiben im System.
Hier ist eine ausgezeichnete lustige Version des Zombie-Prozesses von Turnoff.us:
Bildnachweis: Turnoff.us
Müssen Sie sich wirklich um Zombie-Prozesse kümmern?
Hier ist wichtig zu sagen, dass Zombie-Prozesse nicht so gefährlich sind, wie der Name klingen mag.
Das Problem kann auftreten, wenn Ihr System über begrenzten RAM verfügt oder wenn zu viele Zombie-Prozesse RAM verbrauchen. Außerdem kann bei den meisten Linux-Prozessen die maximale PID auf 32768 eingestellt sein. Wenn keine IDs für andere produktive Aufgaben verfügbar sind, kann Ihr System abstürzen.
Dies passiert selten, aber es ist eine Möglichkeit, insbesondere wenn ein schlecht codiertes Programm beginnt, zahlreiche Zombie-Prozesse zu induzieren.
In einem solchen Fall wäre es eine gute Idee, den Zombie-Prozess zu finden und zu töten.
Wie finde ich Zombie-Prozesse?
Ein Prozess unter Linux kann einen der folgenden Zustände haben:
- D = ununterbrochener Schlaf
- ich = im Leerlauf
- R = läuft
- S = schlafen
- T = gestoppt durch Auftragssteuersignal
- t = vom Debugger während des Trace angehalten
- Z = Zombie
Aber wo sieht man die Prozesse und ihren jeweiligen Status? Eine einfache Möglichkeit besteht darin, das Terminal und die oberstes Kommando.
Top-Befehl Prozesse und deren Status anzeigen
Wie Sie im obigen Screenshot sehen können, gibt es insgesamt 250 Tasks (oder Prozesse), 1 wird ausgeführt, 248 Prozesse ruhen und 1 befindet sich im Zombie-Zustand.
Nun stellt sich die Frage, wie man den Zombie-Prozess abtötet.
Wie finde und töte ich einen Zombie-Prozess? Kann ein Zombie-Prozess getötet werden?
Ein Zombie-Prozess ist bereits tot. Wie beendet man einen bereits toten Prozess?
In den Zombiefilmen schießt man den Zombies in den Kopf oder verbrennt ihn. Das ist hier keine Option. Sie können Ihr System brennen, um den Zombie-Prozess zu beenden, aber das ist keine praktikable Lösung;)
Einige Leute schlagen vor, ein SIGCHLD-Signal an den übergeordneten Prozess zu senden. Aber es wird eher ignoriert. Die andere Möglichkeit, den Zombie-Prozess zu beenden, besteht darin, seinen übergeordneten Prozess zu beenden. Das klingt brutal, aber das ist die einzige sichere Methode, um Zombie-Prozesse zu töten.
Lassen Sie uns zunächst die Zombie-Prozesse auflisten, um ihre ID zu erfahren. Es kann erreicht werden durch mit dem ps-Befehl so im Terminal.
ps ux | awk '{if($8=="Z+") print}'
Die 8. Spalte in der Ausgabe des Befehls ps ux zeigt den Status eines Prozesses an. Sie bitten darum, alle übereinstimmenden Zeilen zu drucken, bei denen der Status eines Prozesses Z+ ist (was den Zombie-Status angibt).
Nachdem Sie seine Prozess-ID identifiziert haben, rufen wir die Prozess-ID des übergeordneten Elements ab.
ps -o ppid= -p <child_id>
Alternativ können Sie die beiden obigen Befehle wie folgt kombinieren, wobei die PID des Zombie-Prozesses und die PID des übergeordneten Prozesses direkt bereitgestellt werden.
ps -A -ostat,pid,ppid | grep -e '[zZ]'
Hier erhalten Sie die ID des übergeordneten Prozesses, beenden Sie also den Prozess schließlich, indem Sie die Befehlszeile mit der entsprechenden ID des zuvor erhaltenen Prozesses eingeben.
kill -9 <parent_process_ID>
Elternprozess töten
Sie können überprüfen, ob der Zombie-Prozess beendet wurde oder nicht, indem Sie den Befehl ps oder sogar den Befehl top erneut ausführen.
Glückwunsch! Jetzt wissen Sie, wie Sie Zombie-Prozesse eliminieren.
Mit Inputs von Abhishek Prakash.