Heim  >  Artikel  >  php教程  >  Umgang mit Zombie-Prozessen unter Linux

Umgang mit Zombie-Prozessen unter Linux

高洛峰
高洛峰Original
2016-12-17 11:54:431419Durchsuche

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

1. Der übergeordnete Prozess wartet mithilfe von Funktionen wie „wait“ und „waitpid“ auf das Ende des untergeordneten Prozesses, wodurch der übergeordnete Prozess hängen bleibt

2. Wenn der übergeordnete Prozess sehr beschäftigt ist, können Sie die Signalfunktion verwenden, um einen Handler für SIGCHLD zu installieren, da der übergeordnete Prozess nach Beendigung des untergeordneten Prozesses das Signal empfängt und Sie im Handler „wait“ aufrufen können, um es zu recyceln

3. Wenn es dem übergeordneten Prozess egal ist, wann der untergeordnete Prozess endet, können Sie signal(SIGCHLD, SIG_IGN) verwenden, um den Kernel darüber zu informieren, dass er nicht am Ende des untergeordneten Prozesses interessiert ist Wenn der Kernel endet, wird er recycelt und sendet keine Signale mehr an den übergeordneten Prozess

 4. Es gibt einige Tricks: Der übergeordnete Prozess verzweigt einen untergeordneten Prozess und arbeitet dann weiter ein Enkelprozess und wird dann beendet. Anschließend wird der Enkelprozess von init übernommen. Allerdings müssen Sie das Recycling des untergeordneten Prozesses selbst durchführen.

Warum tritt der untergeordnete Prozess nach seinem Ende in den Zombie-Status ein?

Weil der übergeordnete Prozess möglicherweise den Exit-Status und andere Informationen des untergeordneten Prozesses erhalten möchte.

Ist der Zombie-Zustand ein Zustand, den jeder untergeordnete Prozess durchläuft?

Jeder untergeordnete Prozess (außer init) verschwindet nicht sofort nach exit(), sondern hinterlässt einen Namen. Es sind die Daten Struktur des Zombie-Prozesses (Zombie) (er belegt einige Speicherressourcen, das heißt, es gibt noch einen Datensatz in der Prozesstabelle), der auf die Verarbeitung durch den übergeordneten Prozess wartet. Dies ist die Phase, die jeder untergeordnete Prozess am Ende durchläuft. Wenn der untergeordnete Prozess nach Exit() keine Zeit zum Verarbeiten hat, können Sie mit dem Befehl ps feststellen, dass der Status des untergeordneten Prozesses „Z“ ist.

Wenn der übergeordnete Prozess rechtzeitig damit umgehen kann, ist es möglicherweise zu spät, den Zombie-Status des untergeordneten Prozesses mithilfe des Befehls ps anzuzeigen. Dies bedeutet jedoch nicht, dass der untergeordnete Prozess den Zombie nicht durchläuft Zustand.

Wenn der übergeordnete Prozess beendet wird, bevor der untergeordnete Prozess endet, wird der untergeordnete Prozess von init übernommen. init verarbeitet den untergeordneten Prozess im Zombie-Zustand als übergeordneten Prozess.

4. So zeigen Sie Zombie-Prozesse an

Unter Linux können Sie mit dem Befehl ps erkennen, dass der mit Z gekennzeichnete Prozess ein Zombie-Prozess ist.

ps -ef|grep defunc kann Zombie-Prozesse finden

Sie können die Option -l von ps verwenden, um detailliertere Prozessinformationen zu erhalten Zahlen stellen den aktuellen Status des Prozesses dar. Die Bedeutung dieser Zahlen ist:

00: Wenn sie alleine angezeigt werden, bedeutet dies, dass der Prozess beendet wurde.

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

 S: Ruhezustand (schlafend)

 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)



5. So löschen Sie Zombie-Prozesse

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!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn