So töten Sie Zombie-Prozesse unter Linux
Veröffentlicht: 2022-01-29Programme, die schlecht geschrieben sind oder schlecht funktionieren, können Zombie-Prozesse in Ihrem Linux-Computer lauern lassen. Finden Sie heraus, wie Zombies erschaffen werden und wie Sie sie endlich zur Ruhe bringen können.
Funktionsweise von Prozesszuständen unter Linux
Linux muss natürlich alle Anwendungen und Daemons verfolgen, die auf Ihrem Computer laufen. Eine Möglichkeit, dies zu tun, besteht darin, die Prozesstabelle zu pflegen. Dies ist eine Liste von Strukturen im Kernel-Speicher. Jeder Prozess hat einen Eintrag in dieser Liste, der einige Informationen darüber enthält.
Es gibt nicht viel in jeder der Prozesstabellenstrukturen. Sie enthalten die Prozess-ID, einige andere Datenelemente und einen Zeiger auf den Prozesssteuerungsblock (PCB) für diesen Prozess.
Es ist das PCB, das die vielen Details enthält, die Linux für jeden Prozess nachschlagen oder einstellen muss. Die Leiterplatte wird auch aktualisiert, wenn ein Prozess erstellt wird, Verarbeitungszeit erhält und schließlich zerstört wird.
Das Linux-PCB enthält über 95 Felder. Es ist als eine Struktur namens task_struct.h
definiert und über 700 Zeilen lang. Die PCB enthält die folgenden Arten von Informationen:
- Prozesszustand : Die Zustände werden unten beschrieben.
- Prozessnummer : Seine eindeutige Kennung innerhalb des Betriebssystems.
- Programmzähler : Wenn diesem Prozess das nächste Mal Zugriff auf die CPU gegeben wird, verwendet das System diese Adresse, um die nächste Anweisung des Prozesses zu finden, die ausgeführt werden sollte.
- Register : Die Liste der CPU-Register, die von diesem Prozess verwendet werden. Die Liste kann Akkumulatoren, Indexregister und Stapelzeiger enthalten.
- Dateiliste öffnen : Dateien, die diesem Prozess zugeordnet sind.
- CPU-Planungsinformationen : Wird verwendet, um festzulegen, wie häufig und wie lange diesem Prozess CPU-Verarbeitungszeit zugeteilt wird. Die Priorität des Prozesses, Zeiger auf Scheduling-Warteschlangen und andere Scheduling-Parameter müssen im PCB aufgezeichnet werden.
- Speicherverwaltungsinformationen : Details über den Speicher, den dieser Prozess verwendet, wie z. B. die Start- und Endadressen des Prozessspeichers und Zeiger auf die Speicherseiten.
- E/A-Statusinformationen : Alle Ein- oder Ausgabegeräte, die vom Prozess verwendet werden.
Der „Prozesszustand“ kann einer der folgenden sein:
- R: Ein laufender oder ausführbarer Prozess. Laufen bedeutet, dass es CPU-Zyklen empfängt und ausführt. Ein lauffähiger Prozess ist betriebsbereit und wartet auf einen CPU-Steckplatz.
- S: Ein Schlafprozess. Der Prozess wartet darauf, dass eine Aktion abgeschlossen wird, z. B. eine Ein- oder Ausgabeoperation, oder dass eine Ressource verfügbar wird.
- D: Der Prozess befindet sich in einem nicht unterbrechbaren Ruhezustand. Es verwendet einen blockierenden Systemaufruf und kann nicht fortgesetzt werden, 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: Der Prozess wurde beendet (gestoppt), weil er das Signal
SIGSTOP
erhalten hat. Es reagiert nur auf die SignaleSIGKILL
oderSIGCONT
, die entweder den Prozess beenden oder ihn anweisen, fortzufahren. Das passiert, wenn Sie von Vordergrund- (fg
) zu Hintergrundaufgaben (bg)
wechseln. - Z: Ein Zombie-Prozess. Wenn ein Prozess abgeschlossen ist, verschwindet er nicht einfach. Es gibt den von ihm verwendeten Speicher frei und entfernt sich selbst aus dem Speicher, aber sein Eintrag in der Prozesstabelle und im PCB bleibt bestehen. Sein Zustand wird auf
EXIT_ZOMBIE
gesetzt, und sein übergeordneter Prozess wird (durch das SignalSIGCHLD
) benachrichtigt, dass der untergeordnete Prozess beendet ist.
Im Zombie-Zustand ruft der übergeordnete Prozess eine der wait()
Funktionsfamilien auf, wenn der untergeordnete Prozess erstellt wird. Es wartet dann auf eine Zustandsänderung im untergeordneten Prozess. Wurde der untergeordnete Prozess durch ein Signal gestoppt, fortgesetzt oder beendet? Wurde es beendet, indem es die natürliche Vervollständigung seines Codes durchlaufen hat?
Wenn die Zustandsänderung bedeutet, dass der untergeordnete Prozess nicht mehr ausgeführt wird, wird sein Beendigungscode gelesen. Dann wird die PCB des Kindes zerstört und ihr Eintrag in der Prozesstabelle entfernt. Im Idealfall geschieht dies alles im Handumdrehen, und Prozesse im Zombie-Zustand existieren nicht sehr lange.
RELATED: So führen Sie Hintergrundprozesse unter Linux aus und steuern sie
Was verursacht Zombie-Prozesse unter Linux?
Ein schlecht geschriebener übergeordneter Prozess ruft die wait()
Funktion möglicherweise nicht auf, wenn der untergeordnete Prozess erstellt wird. Dies bedeutet, dass nichts auf Zustandsänderungen im untergeordneten Prozess wartet und das SIGCHLD
-Signal ignoriert wird. Oder vielleicht beeinträchtigt eine andere Anwendung die Ausführung des übergeordneten Prozesses, entweder aufgrund schlechter Programmierung oder böswilliger Absicht.
Wenn der übergeordnete Prozess jedoch nicht auf Zustandsänderungen im untergeordneten Prozess achtet, findet keine ordnungsgemäße Systemverwaltung statt. Das PCB und der Eintrag in der Prozesstabelle werden nicht entfernt, wenn der untergeordnete Prozess beendet wird. Dies führt dazu, dass der Zombie-Zustand niemals von der Leiterplatte entfernt wird.
Zombies verbrauchen etwas Speicher, aber sie stellen normalerweise kein Problem dar. Der Eintrag in der Prozesstabelle ist klein, aber bis zu seiner Freigabe kann die Prozess-ID nicht wiederverwendet werden. Auf einem 64-Bit-Betriebssystem verursacht dies wahrscheinlich keine Probleme, da die PCB viel größer ist als der Eintrag in der Prozesstabelle.
Eine große Anzahl von Zombies könnte möglicherweise die Menge an Speicher beeinflussen, die für andere Prozesse frei ist. Wenn Sie jedoch so viele Zombies haben, haben Sie ein ernsthaftes Problem mit der übergeordneten Anwendung oder einen Betriebssystemfehler.
So entfernen Sie Zombie-Prozesse
Sie können einen Zombie-Prozess nicht töten, weil er bereits tot ist. Es reagiert auf keine Signale, weil es aus dem Speicher entfernt wurde – es gibt keinen Ort, an dem ein SIGKILL
-Signal gesendet werden kann. Sie können versuchen, das SIGCHLD
-Signal an den übergeordneten Prozess zu senden, aber wenn es beim Beenden des untergeordneten Prozesses nicht funktioniert hat, funktioniert es wahrscheinlich auch jetzt nicht.
Die einzig zuverlässige Lösung besteht darin, den übergeordneten Prozess zu beenden. Wenn es beendet wird, werden seine untergeordneten Prozesse vom init
-Prozess geerbt, der der erste Prozess ist, der in einem Linux-System ausgeführt wird (seine Prozess-ID ist 1).
Der init
Prozess führt regelmäßig die notwendige Bereinigung von Zombies durch. Um sie also zu töten, müssen Sie nur den Prozess beenden, der sie erstellt hat. Der top
Befehl ist eine praktische Möglichkeit, um zu sehen, ob Sie Zombies haben.
Geben Sie Folgendes ein:
oben
Dieses System hat acht Zombie-Prozesse. Wir können diese auflisten, indem wir den Befehl ps
verwenden und ihn an egrep
. Auch hier haben Zombie-Prozesse ein Status-Flag von „Z“, und Sie werden normalerweise auch „deunct“ sehen.
Geben Sie Folgendes ein:
ps aux | egrep "Z|verstorben"
Die Zombie-Prozesse werden aufgelistet.
Dies ist ein einfacherer Weg, um die Prozess-IDs von Zombies zu entdecken, als durch top
hin und her zu scrollen. Wir sehen auch, dass eine Anwendung namens „badprg“ diese Zombies hervorgebracht hat.
Die Prozess-ID des ersten Zombies ist 7641, aber wir müssen die Prozess-ID seines übergeordneten Prozesses finden. Wir können dies tun, indem wir erneut
verwenden. Wir verwenden die Ausgabeoption ( ps
-o
), um ps
, nur die Prozess-ID des übergeordneten Prozesses anzuzeigen, und übergeben sie dann mit dem Flag ppid=
.
Der zu findende Prozess wird mit der Option -p
(Prozess) angegeben und dann die Prozess-ID des Zombies übergeben.
Daher geben wir den folgenden Befehl ein, um die Prozessinformationen für Prozess 7641 nachzuschlagen, aber es wird nur die ID des übergeordneten Prozesses gemeldet:
ps -o ppid= -p 7641
Uns wird gesagt, dass die ID des übergeordneten Prozesses 7636 ist. Wir können dies jetzt mit einem Querverweis wiedergeben, indem wir erneut ps
verwenden.
Wir sehen, dass dies mit dem Namen des übergeordneten Prozesses von früher übereinstimmt. Verwenden Sie zum Beenden des übergeordneten Prozesses die Option SIGKILL mit dem Befehl kill wie folgt:
kill-SIGKILL 7636
Abhängig vom Eigentümer des übergeordneten Prozesses müssen Sie möglicherweise auch sudo
verwenden.
Zombies sind nicht gruselig …
… es sei denn, sie sind in einer riesigen Horde. Einige sind kein Grund zur Sorge und ein einfacher Neustart wird sie löschen.
Wenn Sie jedoch feststellen, dass eine Anwendung oder ein Prozess immer Zombies hervorbringt, sollten Sie sich damit befassen. Es ist höchstwahrscheinlich nur ein schlampig geschriebenes Programm, in diesem Fall gibt es vielleicht eine aktualisierte Version, die nach ihren untergeordneten Prozessen ordnungsgemäß aufräumt.