Heim >php教程 >PHP开发 >So bereinigen Sie Zombie-Prozesse unter Linux

So bereinigen Sie Zombie-Prozesse unter Linux

高洛峰
高洛峰Original
2016-12-17 11:26:321160Durchsuche

Bei der heutigen Wartung des Servers habe ich 5 Zombie-Prozesse von nova-novncproxy gefunden.

  26327 ?        S      0:05  \_ /usr/bin/python /usr/bin/nova-novncproxy --config-file=/etc/nova/nova.conf
 4765 ?        Z      0:00      \_ [nova-novncproxy] <defunct>
 4766 ?        Z      0:00      \_ [nova-novncproxy] <defunct>
 4767 ?        Z      0:00      \_ [nova-novncproxy] <defunct>
 4768 ?        Z      0:00      \_ [nova-novncproxy] <defunct>
 4769 ?        Z      0:00      \_ [nova-novncproxy] <defunct>

Da ich vorher nicht viel über den Zombie-Prozess wusste, habe ich schnell einen entsprechenden Artikel gefunden, um zu lernen, wie man damit umgeht.

Definition

In der UNIX-Systemterminologie wird ein Prozess, der beendet wurde, dessen Eltern jedoch noch nicht darauf gewartet haben, als Zombie bezeichnet.

In UNIX-System, A Der Prozess endet, aber sein übergeordneter Prozess wartet nicht darauf (Aufruf wait/waitpid), dann wird er im fork()/execve()-Prozess zu einem Zombie-Prozess, vorausgesetzt, dass der übergeordnete Prozess noch existiert, wenn der untergeordnete Prozess endet , Allerdings hat der übergeordnete Prozess weder die SIGCHLD-Signalverarbeitungsfunktion vor fork() installiert und waitpid() aufgerufen, um auf das Ende des untergeordneten Prozesses zu warten, noch hat er das Signal explizit ignoriert, dann wird der untergeordnete Prozess zu einem Zombie-Prozess.

Wie überprüfe ich Zombie-Prozesse auf einem Linux-System und wie zähle ich, wie viele Zombie-Prozesse es gibt?

#ps -ef |.

Wenn Sie den Top-Befehl zum Anzeigen verwenden, gibt es außerdem eine Spalte mit S. Wenn der Status Z ist, bedeutet dies, dass es sich um einen Zombie-Prozess handelt.

Aufgaben: 95 insgesamt, 1 läuft, 94 schlafend, 0 gestoppt, 0 Zombie

Zombieprozesse werden auch im obersten Befehl gezählt. Oder verwenden Sie den folgenden Befehl:

ps -ef |. grep -v grep |.

Im Allgemeinen ist es schwierig, Zombie-Prozesse direkt zu töten, aber Sie können Zombie-Vater töten. Nachdem der übergeordnete Prozess gestorben ist, wird der Zombie-Prozess zu einem „verwaisten Prozess“ und wird an Prozess Nr. 1 übernommen. Init ist immer für die Bereinigung des Zombie-Prozesses verantwortlich. Alle von ihm erzeugten Zombie-Prozesse verschwanden ebenfalls.

ps -e -o ppid,stat |. cut -d“ ” -f2 | -ostat,ppid |. grep -e '^[Zz]' |. awk '{print $2}``

Natürlich können Sie selbst ein besseres Shell-Skript schreiben, das Sie gerne mit allen teilen.

Ich habe nova-novncproxy gestoppt und dann erneut gestartet. Der Zombie-Prozess verschwand und das Problem wurde gelöst.

Wenn der untergeordnete Prozess stirbt, wird außerdem 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. Es basiert auf diesem Prinzip: Auch wenn der übergeordnete Prozess nicht „wait“ aufruft, sendet der Kernel ihm eine SIGCHLD-Nachricht. Obwohl die Standardverarbeitung zu diesem Zeitpunkt darin besteht, sie zu ignorieren, können Sie auf diese Nachricht antworten Legen Sie eine Verarbeitungsfunktion fest.

Wie vermeide ich Zombie-Prozesse?

Die Handhabung des SIGCHLD-Signals ist nicht erforderlich. Für einige Prozesse, insbesondere Serverprozesse, werden jedoch häufig untergeordnete Prozesse generiert, um Anfragen zu verarbeiten, wenn Anfragen eingehen. Wenn der übergeordnete Prozess nicht auf das Ende des untergeordneten Prozesses wartet, wird der untergeordnete Prozess zu einem Zombie-Prozess (Zombie) und belegt Systemressourcen. Wenn der übergeordnete Prozess auf das Ende des untergeordneten Prozesses wartet, erhöht dies die Belastung des übergeordneten Prozesses und beeinträchtigt die Parallelitätsleistung des Serverprozesses. Unter Linux können Sie die Funktion des SIGCHLD-Signals einfach auf SIG_IGN setzen.

signal(SIGCHLD,SIG_IGN);

Auf diese Weise generiert der Kernel keinen Zombie-Prozess, wenn der untergeordnete Prozess endet. Dies unterscheidet sich von BSD4. Unter BSD4 müssen Sie explizit warten, bis der untergeordnete Prozess beendet ist, bevor Sie den Zombie-Prozess

oder

mit zweimaliger Verwendung von fork() freigeben, und der folgende untergeordnete Prozess wird beendet direkt Ja Der Enkelprozess wird zu einem verwaisten Prozess, daher ist der Init-Prozess für das Löschen dieses verwaisten Prozesses verantwortlich.



Weitere Artikel zum Bereinigen von 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