GNU/Linux >> LINUX-Kenntnisse >  >> Linux

So beenden Sie Zombie-Prozesse in Linux

Ein Zombie-Prozess in Linux bezieht sich auf diese bereits toten Prozesse, die aber auf die eine oder andere Weise immer noch in der Prozesstabelle des Systems vorhanden sind. Die Lücke besteht darin, dass dieser Prozess aus irgendeinem Grund nicht vom übergeordneten Prozess aus der Prozesstabelle entfernt wurde. Normalerweise geschieht dies nach Abschluss des Ausführungsprozesses.

Die übliche Arbeitsweise in Linux besteht darin, dass ein Prozess, nachdem er seine Ausführung abgeschlossen hat, seinen übergeordneten Prozess benachrichtigt, der dafür verantwortlich ist, den Prozess aus der Tabelle zu entfernen. Leider ist der Elternteil nicht in der Lage, den Prozess aus dem Speicher zu entfernen, wenn der Elternteil den Status des Kindes nicht lesen kann. So kommt es, dass wir tote Prozesse in der Prozesstabelle haben. Dies nennen wir die Zombie-Prozesse.

Was verursacht Linux-Zombie-Prozesse?

Wenn der untergeordnete Prozess erstellt wird, kann es sein, dass ein schlecht geschriebener übergeordneter Prozess die Funktion wait() nicht aufruft. Infolgedessen werden seine Zombiekinder in Erinnerung bleiben, bis sie ausgelöscht werden.

Dies bedeutet, dass nichts den Säuglingsprozess auf Zustandsänderungen überwacht und das SIGCHLD-Signal ignoriert wird. Vielleicht stört eine andere Anwendung die Ausführung des übergeordneten Prozesses, entweder durch schlechte Programmierung oder böswillige Absicht.

Die ordnungsgemäße Systemverwaltung findet nicht statt, wenn der übergeordnete Prozess nicht auf Zustandsänderungen im untergeordneten Prozess achtet.

Wenn der Säuglingsprozess beendet ist, werden die PCB und der Eintrag in der Prozesstabelle nicht entfernt. Der Zombie-Zustand wird dadurch niemals von der Platine entfernt.

Zombies haben ein gewisses Gedächtnis, aber das ist normalerweise kein Problem. Da Linux-Systeme eine endliche Anzahl von PIDs (wenn auch eine große Anzahl) haben, kann kein anderer Prozess gestartet werden, wenn genügend PIDs zombisiert werden. Es ist zweifelhaft, dass dies passieren wird.

Zombie-Prozesse deuten jedoch darauf hin, dass bei einer Anwendung etwas schief gelaufen ist und ein bestimmtes Programm möglicherweise einen Fehler aufweist.
Softwarefehler in Rechenzentren sollten nicht toleriert werden und müssen behoben werden.
Sie sollten ein Auge darauf haben Suchen und zerstören Sie Zombie-Prozesse, bis der Fehler behoben ist.

Die Prozess-ID kann nicht wiederverwendet werden, bis sie gestartet wird, daher ist der Eintrag in der Prozesstabelle winzig.
Da das PCB viel größer ist als der Prozesstabelleneintrag in einem 64-Bit-Betriebssystem, ist dies unwahrscheinlich, dass dies zu Problemen führt .

Die für andere Prozesse verfügbare Speichermenge könnte durch eine große Anzahl von Zombies beeinträchtigt werden. Wenn Sie jedoch so viele Zombies haben, haben Sie ein schwerwiegendes Problem mit der übergeordneten Anwendung oder einen Fehler im Betriebssystem.

Was tun Sie also, wenn sich ein Eingriff in einen Zombie verwandelt? Du spürst die Zombie-Prozesse auf und eliminierst sie.

Wie finde ich einen Zombie-Prozess?

Der erste Schritt zum Töten eines Zombie-Prozesses im System besteht darin, ihn zuerst zu identifizieren. Da der Init-Prozess regelmäßig nach Zombies säubert, müssen Sie nur den Prozess zerstören, der sie erstellt hat, um sie loszuwerden.

Mit dem obersten Befehl können Sie schnell feststellen, ob sich Zombies in Ihrer Nähe befinden. Um dies zu erreichen, führen wir den folgenden Befehl aus.

top

Die Anzahl der Zombie-Prozesse in diesem System wird in der Ausgabe angezeigt. In unserem obigen Fall haben wir 0 Zombies.
Indem wir den Befehl ps verwenden und ihn an egrep weiterleiten, können wir eine Liste von ihnen erhalten. Das Status-Flag für Zombie-Prozesse ist „Z“, und manchmal wird auch „nicht mehr existierend“ angezeigt.

tuts@fosslinux:~$ ps aux | egrep "Z|defunct"

Lassen Sie uns die verschiedenen Abschnitte dieses Befehls aufschlüsseln.

Z in der STAT-Spalte der Ausgabe identifiziert einen Zombie-Prozess.
[defunct] in der letzten (COMMAND)-Spalte der Ausgabe identifiziert ebenfalls einen Zombie-Prozess.

Im Idealfall ist es nicht möglich, einen Zombie-Prozess zu beenden, weil er tot ist. Stattdessen benachrichtigen wir das übergeordnete Element, um zu versuchen, den Prozessstatus des untergeordneten Prozesses zu lesen und ihn schließlich aus der Tabelle des Systems zu entfernen. Um diesen Prozess auszulösen, senden wir ein SIGCHLD-Signal an den übergeordneten Prozess. Um die übergeordnete Prozess-ID oder sogenannte PID zu identifizieren, müssen Sie den folgenden Befehl ausführen:

tuts@fosslinux:~$ ps -o ppid= <Child PID>

Nachdem Sie die PID des Zombies erhalten haben, verwenden Sie das Befehlssignal SIGCHLD für die zuvor identifizierten übergeordneten Prozesse.

tuts@fosslinux:~$ kill -s SIGCHLD <Parent PID>

In einigen Fällen wird der Zombie-Prozess dadurch nicht gelöscht. Das ruft uns dazu, uns auf Plan b oder c einzulassen. Der Prior beinhaltet das Neustarten des übergeordneten Prozesses oder das Beenden der übergeordneten Prozesse. Auf der anderen Seite beinhalten letztere Fälle einen Systemneustart, insbesondere wenn der Zombie-Prozess einen Ausfall oder einen massiven Anstieg aufgrund des Zombie-Prozesses verursachen könnte.

Unten ist der Befehl zum Beenden des übergeordneten Prozesses.

tuts@fosslinux:~$ kill -9 <Parent PID>

Falls ein übergeordneter Prozess beendet wird, werden durch Erweiterung auch alle untergeordneten Prozesse des angegebenen übergeordneten Prozesses beendet. Falls einer der untergeordneten Prozesse zu einem bestimmten Zeitpunkt kritisch ist, müssen Sie das Töten möglicherweise verschieben, bis es sicher ist. Andererseits kann Ihnen eine schnelle Doppelprüfung sagen, wie viel Speicher oder Rechenleistung die Zombie-Prozesse verbrauchen. Dies hilft festzustellen, ob es die bessere Option ist, den übergeordneten Prozessor zu beenden, um das System im folgenden Zyklus der bereits geplanten Systemwartung neu zu starten.

Wie funktionieren Prozesszustände unter Linux?

Natürlich muss Linux alle Anwendungen und Daemons verfolgen, die auf Ihrem Computer laufen. Das Pflegen der Prozesstabelle ist eine der Möglichkeiten, dies zu erreichen.
Dies ist eine Liste von Kernel-Speicherstrukturen. Diese Liste enthält einen Eintrag für jeden Prozess, der einige Informationen darüber enthält. Jede der Prozesstabellenstrukturen enthält sehr wenige Informationen.

Sie speichern die Prozess-ID, einige andere Informationen und einen Zeiger auf den Prozesssteuerungsblock (PCB).

Auf dem PCB speichert Linux alle Informationen, die es für jeden Prozess nachschlagen oder einstellen muss. Wenn ein Prozess erstellt wird, wird er modifiziert, mit einer Verarbeitungszeit versehen und dann zerstört.

Es gibt über 95 Felder auf dem Linux-PCB. Es ist in der Aufgabenstruktur definiert, die über 700 Zeilen lang ist. Die folgenden Arten von Informationen können auf der Platine gefunden werden:

Die Zustände des Prozesses sind unten dargestellt

  • Prozessnummer:Die eindeutige Kennung des Betriebssystems.
  • Programmzähler:Wenn diesem Prozess erneut Zugriff auf die CPU gewährt wird, verwendet das System diese Adresse, um die nächste auszuführende Anweisung des Prozesses zu lokalisieren.
  • Register:Dieses Verfahren verwendet eine Liste von CPU-Registern, die Register genannt werden. Akkumulatoren, Indexregister und Stapelzeiger können in die Liste aufgenommen werden.
  • Liste der geöffneten Dateien:Mit diesem Verfahren verknüpfte Dateien sind in der Liste der geöffneten Dateien enthalten.
  • CPU-Scheduling-Informationen:Wird verwendet, um zu berechnen, wie oft und wie lange dieser Prozess CPU-Verarbeitungszeit erhält.
    Das PCB muss die Prozesspriorität, Zeiger auf Scheduling-Warteschlangen und andere Scheduling-Parameter aufzeichnen.
  • Speicherverwaltungsinformationen:Informationen über den Speicher, den dieser Prozess verwendet, wie z. B. die Start- und Endadressen des Prozessspeichers sowie Zeiger auf Speicherseiten.
  • Informationen zum E/A-Status:Alle Geräte, die der Prozess als Ein- oder Ausgänge verwendet.

Jeder der folgenden Zustände kann der „Prozesszustand“ sein:

  • R:Ein laufender oder ausführbarer Prozess. Es läuft, was bedeutet, dass es CPU-Zyklen erhält und ausführt.
    Eine ausführungsbereite Prozedur wartet auf einen CPU-Slot.
  • S:Der Akt des Schlafens.
    Der Prozess wartet auf den Abschluss einer Aktion, wie z. B. einer Eingabe- oder Ausgabeoperation. Oder die Verfügbarkeit einer Ressource.
  • D:Die Prozedur befindet sich in einem Zustand des nicht unterbrechbaren Ruhezustands. Es verwendet einen blockierenden Systemaufruf, was bedeutet, dass es nicht fortgesetzt wird, bis die Systemaufrufe abgeschlossen sind. Im Gegensatz zum „Ruhezustand“ reagiert ein Prozess in diesem Zustand nicht auf Signale, bis der Systemaufruf abgeschlossen ist und die Ausführung zum Prozess zurückgekehrt ist.
  • T:Da es das SIGSTOP-Signal erhalten hat, ist der Prozess beendet (gestoppt).
    Es wird nur auf die Signale SIGKILL oder SIGCONT reagieren, indem es den Prozess entweder beendet oder anweist, fortzufahren. Wenn Sie von Vordergrund- (fg) zu Hintergrundaufgaben (bg) wechseln, passiert dies.
  • Z:steht für Zombie Process. Wenn ein Prozess abgeschlossen ist, verschwindet er nicht einfach. Stattdessen gibt er jeglichen Speicher frei, den er gerade verwendet, und verlässt den Speicher, aber sein Prozesstabelleneintrag und sein PCB bleiben erhalten.
    Sein Zustand wird auf EXIT ZOMBIE gesetzt, und seinem übergeordneten Prozess wird mitgeteilt, dass der Säuglingsprozess über abgeschlossen wurde SIGCHLD-Signal.

Schlussfolgerung

Zombies sind nicht so schädlich, es sei denn, sie sind Teil einer riesigen Horde. Ein paar sind keine große Sache, und ein schneller Neustart wird sie löschen. Es gibt jedoch einen Punkt zu beachten.

Linux-Architekturen haben eine maximale Anzahl von Prozessen und folglich eine maximale Anzahl von Prozess-ID-Nummern. Wenn die maximale Anzahl an Zombie-Prozessen eines Computers erreicht ist, können keine neuen Prozesse gestartet werden.

Zombie-Prozesse sind keine Prozesse; Sie sind die Überbleibsel von toten Prozessen, die ihr übergeordneter Prozess nicht richtig bereinigt hat. Wenn Sie jedoch feststellen, dass eine bestimmte Anwendung oder ein bestimmter Prozess ständig Zombies hervorbringt, sollten Sie dies weiter untersuchen.

Höchstwahrscheinlich ist es nur ein schlecht geschriebenes Programm; In diesem Fall gibt es vielleicht eine aktualisierte Version, die nach den untergeordneten Prozessen ordnungsgemäß bereinigt.


Linux
  1. So beenden Sie einen Zombie-Prozess unter Linux

  2. So finden und töten Sie den Zombie-Prozess in Linux

  3. Was sind Zombie-Prozesse und wie findet und tötet man Zombie-Prozesse?

  4. So beenden Sie den Zombie-Prozess

  5. Wie man einen Prozess unter Linux anhält/fortsetzt

So finden und töten Sie Zombie-Prozesse in CentOS 8

So töten Sie Zombie-Prozesse in Ubuntu 20.04 LTS

So beenden Sie den laufenden Linux-Prozess auf einem bestimmten Port

Wie man einen Prozess unter Linux beendet

So töten Sie Zombie-Prozesse in Ubuntu

So beenden Sie Prozesse in Linux mit kill, killall und pkill