Ein Zombie-Prozess in Linux bezieht sich auf diese bereits toten Prozesse, die aber auf die eine oder andere Weise noch in der Prozesstabelle des Systems vorhanden sind. Die Lücke besteht darin, dass dieser Prozess aus irgendeinem Grund nicht vom übergeordneten Element aus der Prozesstabelle entfernt wurde. Normalerweise geschieht dies nach Abschluss des Ausführungsprozesses.
Die übliche Vorgehensweise in Linux besteht darin, dass ein Prozess, nachdem er seine Ausführung abgeschlossen hat, seinen übergeordneten Prozess benachrichtigt, der für das Entfernen des Prozesses aus der Tabelle verantwortlich ist. Leider können die Eltern den Prozess nicht aus dem Speicher entfernen, wenn die Eltern den Status des Kindes nicht lesen können. So kommt es, dass wir tote Prozesse in der Prozesstabelle haben. Dies sind die sogenannten Zombie-Prozesse.
Was verursacht Linux-Zombie-Prozesse??
Wenn der untergeordnete Prozess erstellt wird, kann ein schlecht geschriebener übergeordneter Prozess möglicherweise die wait()-Funktion nicht aufrufen. Infolgedessen werden seine Zombie-Kinder 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 lausige Programmierung oder böswillige Absicht.
Die ordnungsgemäße Systemverwaltung erfolgt nicht, wenn der übergeordnete Prozess nicht auf Zustandsänderungen im untergeordneten Prozess achtet.
Wenn der Säuglingsprozess abgeschlossen ist, werden die Leiterplatte und der Eintrag in der Prozesstabelle nicht entfernt. Der Zombie-Zustand wird dadurch nie von der Platine entfernt.
Zombies haben zwar etwas Gedächtnis, aber normalerweise ist das kein Problem. Da Linux-Systeme eine endliche Anzahl von PIDs haben (wenn auch eine große Anzahl), kann kein anderer Prozess gestartet werden, wenn genügend PIDs zombiert werden. Es ist zweifelhaft, dass das passieren wird.
Zombie-Prozesse deuten jedoch darauf hin, dass mit 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 nach Zombie-Prozessen Ausschau halten und diese zerstören, bis der Fehler behoben ist.
Die Prozess-ID kann erst nach dem Start wiederverwendet werden, daher ist der Eintrag in der Prozesstabelle winzig.
Da die Leiterplatte in einem 64-Bit-Betriebssystem viel größer ist als der Prozesstabelleneintrag, ist dies unwahrscheinlich, dass es zu Problemen kommt.
Der für andere Prozesse verfügbare Speicher 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.
Also, was tun Sie, wenn eine Prozedur zu einem Zombie wird?? Sie spüren die Zombie-Prozesse auf und beseitigen sie.
So finden Sie einen Zombie-Prozess?
Der erste Stopp beim Töten eines Zombie-Prozesses im System besteht darin, ihn zuerst zu identifizieren. Da der Init-Prozess regelmäßig nach Zombies aufräumt, müssen Sie nur den Prozess zerstören, der sie erstellt hat, um sie loszuwerden.
Der oberste Befehl ist eine schnelle Möglichkeit, um zu sehen, ob sich Zombies in Ihrer Nähe befinden. Um dies zu erreichen, führen wir den folgenden Befehl aus.
oben
Die Anzahl der Zombie-Prozesse in diesem System wird auf der Ausgabe angezeigt. In unserem obigen Fall haben wir 0 Zombies.
Mit dem ps-Befehl und dem Pipettieren in egrep können wir eine Liste davon erhalten. Die Statusflagge für Zombie-Prozesse ist „Z“, und manchmal wird auch „verstorben“ angezeigt.
tuts@fosslinux:~$ ps aux | egrep "Z|verstorben"
Lassen Sie uns die verschiedenen Abschnitte dieses Befehls aufschlüsseln.
Z in der Spalte STAT der Ausgabe identifiziert einen Zombie-Prozess.
[defunct] in der letzten Spalte (COMMAND) der Ausgabe identifiziert auch einen Zombie-Prozess.
Im Idealfall ist es nicht möglich, einen Zombie-Prozess zu beenden, da er tot ist. Stattdessen benachrichtigen wir die Eltern, zu versuchen, den Prozessstatus des Kindes zu lesen und es schließlich aus der Systemtabelle zu entfernen. Um diesen Prozess auszulösen, senden wir ein SIGCHLD-Signal an die Eltern des Prozesses. Um die ID des übergeordneten Prozesses oder die sogenannte PID zu identifizieren, müssen Sie den folgenden Befehl ausführen:
tuts@fosslinux:~$ ps -o ppid=
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
In einigen Fällen klärt dies den Zombie-Prozess nicht. Dies ruft uns dazu auf, uns an Plan b oder c zu beteiligen. Die vorherige beinhaltet das Neustarten des übergeordneten Prozesses oder das Beenden der übergeordneten Prozesse. Auf der anderen Seite beinhalten die letzteren Fälle einen Systemneustart, insbesondere wenn der Zombie-Prozess aufgrund des Zombie-Prozesses einen Ausfall oder einen massiven Anstieg verursachen könnte.
Unten ist der Befehl zum Beenden des übergeordneten Prozesses.
tuts@fosslinux:~$ kill -9
Falls ein übergeordneter Prozess beendet wird, werden auch alle untergeordneten Prozesse des angegebenen übergeordneten Prozesses getötet. Falls einer der untergeordneten Prozesse zu einem bestimmten Zeitpunkt kritisch ist, müssen Sie das Töten möglicherweise verschieben, bis es sicher ist. Auf der anderen Seite kann Ihnen eine schnelle Überprü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 einen Neustart des Systems im nächsten Zyklus der bereits geplanten Systemwartung durchzuführen.
Wie funktionieren Prozesszustände unter Linux??
Natürlich muss Linux alle Anwendungen und Daemons verfolgen, die auf Ihrem Computer ausgeführt werden. Die Pflege 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 der Platine speichert Linux alle Informationen, die es zum Nachschlagen oder Einstellen für jeden Prozess benötigt or. Wenn ein Prozess erstellt wird, wird er modifiziert, mit Verarbeitungszeit versehen und dann zerstört.
Es gibt über 95 Felder auf der Linux-Platine. Es ist in der Aufgabenstruktur definiert, die über 700 Zeilen lang ist. Die folgenden Arten von Informationen finden Sie auf der Platine:
Die Zustände des Prozesses sind unten dargestellt
- Prozessnummer: Die eindeutige Kennung des Betriebssystems.
- Programmzähler: Wenn diesem Prozess wieder Zugriff auf die CPU gewährt wird, verwendet das System diese Adresse, um die nächste auszuführende Anweisung des Prozesses zu finden.
- Register: Dieses Verfahren verwendet eine Liste von CPU-Registern, die als Register bezeichnet werden. Akkumulatoren, Indexregister und Stapelzeiger können in die Liste aufgenommen werden.
- Open File List: Dateien, die mit diesem Verfahren verknüpft sind, sind in der Open File List enthalten Open.
- CPU-Planungsinformationen: Wird verwendet, um zu berechnen, wie oft und wie lange dieser Prozess CPU-Verarbeitungszeit erhält.
Der PCB muss die Prozesspriorität, Zeiger auf Scheduling-Warteschlangen und andere Scheduling-Parameter aufzeichnen. - Speicherverwaltungsinformationen: Informationen über den Speicher, der von diesem Prozess verwendet wird, wie die Start- und Endadresse des Prozessspeichers sowie Zeiger auf Speicherseiten.
- Informationen zum I/O-Status: Alle Geräte, die der Prozess als Ein- oder Ausgänge verwendet.
Jeder der folgenden kann der „Prozessstatus“ sein:
- R: Ein laufender oder lauffähiger Prozess. Es läuft, was bedeutet, dass es CPU-Zyklen erhält und ausführt.
Eine laufbereite Prozedur wartet auf einen CPU-Steckplatz. - S: Der Akt des Schlafens.
Der Prozess wartet auf den Abschluss einer Aktion, z. B. einer Eingabe- oder Ausgabeoperation. Oder die Verfügbarkeit einer Ressource. - D: Das Verfahren befindet sich in einem nicht unterbrechbaren Ruhezustand. Es verwendet einen blockierenden Systemaufruf, was bedeutet, dass er nicht fortgesetzt wird, bis die Systemaufrufe abgeschlossen sind. Im Gegensatz zum „Schlaf“-Zustand 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 reagiert nur auf die Signale SIGKILL oder SIGCONT, 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-Prozess. Wenn ein Prozess abgeschlossen ist, verschwindet er nicht einfach. Stattdessen gibt es den derzeit verwendeten Speicher frei und verlässt den Speicher, aber der Prozesstabelleneintrag und die PCB bleiben erhalten.
Sein Status wird auf EXIT ZOMBIE gesetzt und seinem Elternprozess wird über das SIGCHLD-Signal mitgeteilt, dass der Säuglingsprozess abgeschlossen wurde.
Fazit
Wenn sie nicht Teil einer riesigen Horde sind, sind Zombies nicht so schädlich. Ein paar sind keine große Sache, und ein schneller Neustart wird sie beseitigen. Es gibt jedoch einen Punkt zu beachten.
Linux-Architekturen haben eine maximale Anzahl von Prozessen und damit eine maximale Anzahl von Prozess-ID-Nummern. Wenn die maximale Anzahl von Zombie-Prozessen eines Computers erreicht ist, können keine neuen Prozesse gestartet werden.
Zombie-Prozesse sind keine Prozesse; Sie sind die Überreste toter Prozesse, 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 weiter nachforschen.
Höchstwahrscheinlich ist es nur ein schlecht geschriebenes Programm; in diesem Fall gibt es vielleicht eine aktualisierte Version, die nach ihren untergeordneten Prozessen ordnungsgemäß bereinigt.