So beenden Sie Zombie-Prozesse unter Linux

Inhalt

Ein Terminalfenster auf einem Linux-Laptop.

Schlecht geschriebene oder fehlerhafte Programme können dazu führen, dass Zombie-Prozesse in Ihrem Linux-Computer lauern.. Finden Sie heraus, wie Zombies entstehen und wie Sie sie kurz ruhen lassen können.

Wie prozedurale Zustände in Linux funktionieren

Linux, selbstverständlich, Sie müssen alle Anwendungen und Daemons im Auge behalten, die auf Ihrem Computer ausgeführt werden. Eine Möglichkeit, dies zu tun, besteht darin, die Prozesstabelle beizubehalten. Dies ist eine Liste von Strukturen im Kernelspeicher. Jedes Verfahren hat einen Eintrag in dieser Liste, der Informationen darüber enthält.

Es gibt nicht viel in jeder der Prozesstabellenstrukturen. Sie halten die Prozessidentifikation, einige andere Datenelemente und ein Zeiger auf den Verfahrenskontrollblock (PCB) für dieses Verfahren.

Es ist das PCB, das die vielen Details enthält, die Linux für jedes Verfahren finden oder konfigurieren muss.. Die Leiterplatte wird auch aktualisiert, wenn eine Prozedur erstellt wird, es wird Bearbeitungszeit gegeben und kurz gesagt, es wird zerstört.

Die Linux-Platine enthält mehr als 95 Felder. Es ist definiert als Struktur namens task_struct.hund hat mehr als 700 Linien. Die Leiterplatte enthält die folgenden Arten von Informationen:

  • Verfahrensstand: Die Zustände sind unten beschrieben.
  • Verfahrensnummer: Ihre eindeutige Kennung innerhalb des Betriebssystems.
  • Programm zähler: Wenn dieses Verfahren Zugriff auf die CPU hat, das System verwendet diese Adresse, um die nächste Anweisung der auszuführenden Prozedur zu finden.
  • Aufzeichnungen: Die Liste der CPU-Register, die von diesem Verfahren verwendet werden. Liste kann Akkumulatoren enthalten, Indexregister und Stackpointer.
  • Dateiliste öffnen: Mit diesem Verfahren verknüpfte Dateien.
  • Informationen zur CPU-Programmierung: Wird verwendet, um die Häufigkeit und Dauer der CPU-Verarbeitungszeit für dieses Verfahren einzustellen. Die Priorität des Verfahrens, Planungswarteschlangenindikatoren und andere Planungsparameter sollten auf der Leiterplatte aufgezeichnet werden.
  • Informationen zur Speicherverwaltung: Details zum von diesem Verfahren verwendeten Speicher, wie die Speicherstart- und -endadressen der Prozedur und Zeiger auf Speicherseiten.
  • E / S: Jedes Eingabe- oder Ausgabegerät, das von der Prozedur verwendet wird.

Die “Stand des Verfahrens” kann eine der folgenden sein:

  • R: Eine laufende oder ausführbare Prozedur. Laufend bedeutet, dass es CPU-Zyklen empfängt und läuft. Eine ausführbare Prozedur ist laufbereit und wartet auf einen CPU-Steckplatz.
  • S: Ein Schlafvorgang. Der Vorgang wartet auf den Abschluss einer Aktion, als Ein- oder Ausgabeoperation, oder dass eine Ressource verfügbar ist.
  • D: Das Verfahren befindet sich in ununterbrochener Aussetzung. Sie verwenden einen blockierenden Systemaufruf und können nicht fortfahren, bis die Systemaufrufe abgeschlossen sind. kann eine der folgenden sein “kann eine der folgenden sein”, Eine Prozedur in diesem Zustand reagiert nicht auf Signale, bis der Systemaufruf abgeschlossen ist und die Ausführung zur Prozedur zurückgekehrt ist.
  • T: Das Verfahren ist beendet (gestoppt) weil er die bekommen hat SIGSTOP Unterschrift. Dass werde nur antworten al SIGKILL Ö SIGCONT Zeichen, die das Verfahren beenden oder Sie anweisen, fortzufahren, bzw. Das passiert, wenn du dich änderst Vordergrund (fg) zum Hintergrund (bg) Hausarbeiten.
  • MIT: Ein Zombie-Verfahren. Wenn ein Verfahren abgeschlossen ist, es geht einfach nicht weg. Gibt den von Ihnen verwendeten Speicher frei und entfernt sich selbst aus dem Speicher, aber sein Eintrag in der Prozesstabelle und PCB bleibt. Sein Status ist auf gesetzt EXIT_ZOMBIE, und sein übergeordnetes Verfahren wird benachrichtigt (für ihn SIGCHLD Unterschrift) dass das Kindverfahren beendet ist.

Im Zombie-Staat, die Elternprozedur ruft eine der wait() Funktionsfamilien wenn untergeordnete Prozedur erstellt wird. Warten Sie dann auf eine Zustandsänderung in der Kindprozedur. Wurde das Verfahren des Kindes gestoppt?, durch ein Signal fortgesetzt oder beseitigt? Haben Sie am Ende die natürliche Vervollständigung Ihres Codes ausgeführt??

Wenn die Statusänderung eine ist, bedeutet dies, dass die untergeordnete Prozedur nicht mehr ausgeführt wird, dein Exit-Code wird gelesen. Nach, das PCB des Kindes wird zerstört und sein Eintrag in der Prozedurtabelle wird entfernt. Im Idealfall, das alles passiert im Handumdrehen, und Prozesse im Zombie-Staat existieren nicht lange.

VERBUNDEN: So führen und steuern Sie Hintergrundprozesse in Linux

Was verursacht Zombie-Prozesse in Linux??

Eine falsch geschriebene übergeordnete Prozedur wird möglicherweise nicht aufgerufen wait() Funktion, wenn untergeordnete Prozedur erstellt wird. Dies bedeutet, dass von den Zustandsänderungen in der Kindprozedur nichts ansteht, und der SIGCHLD das Signal wird ignoriert. Oder vielleicht beeinflusst eine andere Anwendung die Ausführung des Hauptverfahrens, entweder aufgrund schlechter Programmierung oder böswilliger Absicht.

Trotz dieses, wenn der übergeordneten Prozedur keine Zustandsänderungen in der untergeordneten Prozedur bekannt sind, Eine ordnungsgemäße Systemwartung findet nicht statt. PCB- und Prozesstabelleneintrag werden nicht entfernt, wenn die untergeordnete Prozedur endet. Dies führt dazu, dass der Zombie-Zustand nie von der Platine entfernt wird..

Zombies verbrauchen ein wenig Gedächtnis, aber im Allgemeinen stellen sie kein Hindernis dar. Der Eintrag in der Prozesstabelle ist klein, aber, bis es veröffentlicht wird, Verfahrens-ID kann nicht wiederverwendet werden. Auf einem Betriebssystem von 64 Bits, Es ist unwahrscheinlich, dass dies zu Problemen führt, da die Leiterplatte viel größer ist als der Prozesstabelleneintrag.

Viele Zombies könnten, möglicherweise, beeinflussen die Menge an Speicher, die für andere Prozesse frei ist. Trotz dieses, wenn du so viele Zombies hast, Sie haben ein ernsthaftes Hindernis mit der Hauptanwendung oder einen Betriebssystemfehler.

So entfernen Sie Zombie-Prozesse

Sie können eine Zombie-Prozedur nicht töten, weil sie bereits tot ist. Reagiert auf kein Signal, da es aus dem Speicher entfernt wurde; Es gibt nirgendwo eine Nachricht zu senden SIGKILL Unterschrift. Sie können versuchen, die zu senden SIGCHLD Signal an übergeordnete Prozedur, aber wenn es nicht funktioniert hat, wenn die untergeordnete Prozedur abgeschlossen ist, funktioniert jetzt auch nicht mehr.

Die einzige zuverlässige Lösung besteht darin, das Hauptverfahren zu entfernen. Wenn es endet, seine untergeordneten Prozesse werden von dem geerbt init Prozess, Dies ist das erste Verfahren, das auf einem Linux-System ausgeführt wird (Ihre Prozedur-ID lautet 1).

das init Das Verfahren führt regelmäßig die notwendige Reinigung von Zombies durch, um sie zu töten, Sie müssen nur die Prozedur beenden, die sie erstellt hat. das top Der Befehl ist eine bequeme Möglichkeit, um zu sehen, ob Sie Zombies haben.

Schreib das Folgende:

oben

Dieses System hat acht Zombie-Prozesse. Uns du kannst diese auflisten Verwendung der ps Befehl und kanalisieren sie in egrep. Ein Mal noch, kann eine der folgenden sein “MIT” und, im Allgemeinen, du wirst auch sehen “kann eine der folgenden sein”.

Schreib das Folgende:

ps an | egrep "MIT|nicht mehr existierend"

Zombie-Prozesse werden aufgelistet.

Dies ist eine bessere Methode, um die Verfahrens-IDs von Zombies herauszufinden, als hin und her zu scrollen top. kann eine der folgenden sein “kann eine der folgenden sein” kann eine der folgenden sein.

Die Prozedur-ID des ersten Zombies lautet 7641, aber wir müssen die Prozedur-ID der übergeordneten Prozedur finden. Wir können es tun mit ps wieder. Wir werden die Exit-Option verwenden (-o) erzählen ps um nur die Prozedur-ID des Elternteils anzuzeigen und sie dann mit dem zu übergeben ppid= Flagge.

Das Verfahren, das wir finden möchten, wird durch das angezeigt -p (Prozess) und dann die Prozedur-ID des Zombies übergeben.

Weil, Wir schreiben den folgenden Befehl, um die Prozedurinformationen für die Prozedur zu finden 7641, aber es wird nur die ID des Hauptverfahrens gemeldet:

ps -o ppid = -p 7641

Uns wurde erwähnt, dass die ID des Hauptverfahrens lautet 7636. Jetzt können wir mit querverweisen ps ein Mal noch.

Wir sehen, dass dies mit dem Namen der obigen Hauptprozedur übereinstimmt. Um die Hauptprozedur zu beenden, Verwenden Sie die SIGKILL-Option mit dem Kill-Befehl wie folgt:

töten -SIGKILL 7636

Abhängig vom Eigentümer des Hauptverfahrens, es ist möglich, dass Sie auch verwenden sollten sudo.

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 entfernen.

Trotz dieses, wenn Sie bemerken, dass eine Anwendung oder ein Verfahren immer Zombies hervorbringt, das musst du analysieren. Höchstwahrscheinlich ist es nur ein schlampig geschriebenes Programm, in welchem ​​Fall, Vielleicht gibt es eine aktualisierte Version, die nach ihren untergeordneten Prozessen ordnungsgemäß aufräumt.

Abonniere unseren Newsletter

Wir senden Ihnen keine SPAM-Mail. Wir hassen es genauso wie du.