1. Was ist ein Zombie-Prozess?
Ein Zombie-Prozess bedeutet, dass sein übergeordneter Prozess nicht darauf gewartet hat (Aufruf „wait/waitpid“), und wenn kein Prozess dies akzeptiert Nachdem der Prozess gestorben ist, wird er zum Zombie-Prozess, also zum (Zombie-)Prozess.
2. Wie Zombie-Prozesse generiert werden
Wenn ein Prozess den Exit-Befehl aufruft, um sein Leben zu beenden, wird er nicht tatsächlich zerstört, sondern hinterlässt einen Datenstruktur namens Zombie-Prozess (Zombie) (Systemaufruf Exit, seine Funktion besteht darin, den Prozess zu beenden, aber er beschränkt sich nur darauf, einen normalen Prozess in einen Zombie-Prozess umzuwandeln und kann ihn nicht vollständig zerstören).
Unter den Linux-Prozessen ist ein Zombie-Prozess eine ganz besondere Art. Er hat fast den gesamten Speicherplatz aufgegeben, hat keinen ausführbaren Code und kann nicht geplant werden. Er behält nur eine Position in der Prozessliste .Aufzeichnen des Exit-Status und anderer Informationen des Prozesses zur Erfassung durch andere Prozesse. Darüber hinaus belegt der Zombie-Prozess keinen Speicherplatz mehr. Es benötigt seinen übergeordneten Prozess, um die Leiche für ihn einzusammeln.
Wenn sein übergeordneter Prozess die Signalverarbeitungsfunktion SIGCHLD nicht installiert und wait oder waitpid() aufruft, um auf das Ende des untergeordneten Prozesses zu warten, und das Signal nicht explizit ignoriert, bleibt er im Zombie-Zustand Wenn der übergeordnete Prozess zu diesem Zeitpunkt endet, übernimmt der Init-Prozess automatisch den untergeordneten Prozess und sammelt seine Leiche ein, und er kann trotzdem gelöscht werden.
Wenn der übergeordnete Prozess jedoch eine Schleife ist und nicht beendet wird, bleibt der untergeordnete Prozess in einem Zombie-Zustand. Aus diesem Grund gibt es manchmal viele Zombie-Prozesse im System. Die Prozessnummern, die vom System verwendet werden können, sind begrenzt. Wenn eine große Anzahl von Zombie-Prozessen generiert wird, kann das System keine neuen Prozesse generieren, da keine Prozessnummern verfügbar sind
3, Vermeidung von Zombie-Prozessen
4. So zeigen Sie Zombie-Prozesse an
01: Der Prozess ist Teil des Kernprozesses und befindet sich im Hauptspeicher des Systems. Zum Beispiel: sched, vhand, bdflush usw.
02: Elternteil verfolgt den Prozess. 04: Das Signal des Elternteils hat den Prozess gestoppt; das Elternteil wartet ( ptrace(S)) Geht in den Ruhezustand über und kann nicht durch ein Signal geweckt werden, z ein zu erstellender Inode
20: Der Prozess wird in den Hauptspeicher (Primärspeicher) geladen
40: Der Prozess ist im Hauptspeicher gesperrt und kann nicht verwendet werden, bis die Transaktion abgeschlossen ist. Ersetzt
S (Status des Prozesses)
O: Der Prozess läuft auf dem Prozessor
R: Warten auf Ausführung (ausführbar)
I: Ruhezustand ( Leerlauf) Z: Zombie-Status (Zombie)
T: Verfolgter Status (Traced)
B: Prozess wartet auf weitere Speicherseiten
C: CPU-Auslastung Geschätzter Wert (CPU-Auslastung)
1. Schreiben Sie den übergeordneten Prozess neu und sammeln Sie den Hauptteil des untergeordneten Prozesses nach seinem Tod. Die spezifische Methode besteht darin, das SIGCHLD-Signal zu übernehmen. Nachdem der untergeordnete Prozess gestorben ist, wird das SIGCHLD-Signal an den übergeordneten Prozess gesendet. Nachdem der übergeordnete Prozess dieses Signal empfangen hat, führt er die Funktion waitpid() aus, um die Leiche des untergeordneten Prozesses einzusammeln. Dies basiert auf dem Prinzip, dass der Kernel ihm eine SIGCHLD-Nachricht sendet, selbst wenn er nicht aufruft. Obwohl die Standardverarbeitung darin besteht, sie zu ignorieren, können Sie eine Verarbeitungsfunktion festlegen, wenn Sie auf diese Nachricht antworten möchten .
SIGCHLD-Signal: Wenn der untergeordnete Prozess endet, empfängt der übergeordnete Prozess dieses Signal. Wenn der übergeordnete Prozess dieses Signal nicht verarbeitet und nicht auf den untergeordneten Prozess wartet, wird der untergeordnete Prozess zwar beendet, belegt aber dennoch einen Eintrag in der Kernel-Prozesstabelle. Zu diesem Zeitpunkt wird der untergeordnete Prozess als Zombie-Prozess bezeichnet. Wir sollten diese Situation vermeiden (der übergeordnete Prozess ignoriert entweder das SIGCHILD-Signal oder fängt es ab oder wartet auf den untergeordneten Prozess, den er erzeugt, oder der übergeordnete Prozess wird zuerst beendet, dann wird die Beendigung des untergeordneten Prozesses automatisch vom Init-Prozess übernommen ).
2. kill -18 PPID (PPID ist sein übergeordneter Prozess)
Dieses Signal teilt dem übergeordneten Prozess mit, dass der untergeordnete Prozess gestorben ist. Bitte nehmen Sie die ihm zugewiesenen Ressourcen zurück.
SIGCONT ist auch ein interessantes Signal. Wie bereits erwähnt, wird dieses Signal verwendet, wenn der Prozess gestoppt wird, um den Prozess anzuweisen, die Ausführung fortzusetzen. Das Interessante an diesem Signal ist, dass es nicht ignoriert oder blockiert, aber abgefangen werden kann. Das Standardverhalten besteht darin, das Signal zu verwerfen.
3. Beenden Sie den übergeordneten Prozess
Wenn Methode 2 nicht beendet werden kann, können Sie die Methode zum Beenden des übergeordneten Prozesses verwenden (wenn der übergeordnete Prozess nicht benötigt wird). , wird der Zombie-Prozess zu einem „verwaisten“ Prozess, der an Prozess Nr. 1, init, übergeben wird. Init ist immer für die Bereinigung des Zombie-Prozesses verantwortlich. Alle von ihm erzeugten Zombie-Prozesse verschwanden ebenfalls.
Überprüfen Sie zunächst, ob im übergeordneten Prozess keine anderen untergeordneten Prozesse vorhanden sind. Wenn dies der Fall ist, müssen Sie möglicherweise zuerst andere untergeordnete Prozesse, also Geschwisterprozesse, beenden. Die Methode lautet:
Kill –15 PID1 PID2 (PID1 und PID2 sind andere untergeordnete Prozesse des übergeordneten Prozesses des Zombie-Prozesses).
Töten Sie dann den übergeordneten Prozess: kill –15 PPID
Auf diese Weise kann der Zombie-Prozess vollständig getötet werden.
Weitere verwandte Artikel zum Umgang mit Zombie-Prozessen unter Linux finden Sie auf der chinesischen PHP-Website!