Halloween unter Linux: Wie man Zombie-Prozesse beendet

Halloween-Stempel

Der Tag der Toten kommt und deshalb wollen wir dieses kleine Tutorial von LxA machen, um über das zu sprechen Zombie-Prozesse und wie wir sie töten können. Das erste, was zu sagen ist, ist, was der Zombie-Prozess ist, und das heißt, wie Sie wissen, verfügt der Linux-Kernel über ein Subsystem zum Verwalten der Prozesse und arbeitet mit dem Scheduler zusammen, um den CPU-Verarbeitungsfluss zu erstellen, zu variieren, zu senden oder zu entfernen Prozesse töten. Nun, dieser Teil des Kernels unterscheidet, wie der Rest von Unix-ähnlichen Systemen, zwischen verschiedenen Prozesszuständen ...

Also können wir das finden ein Prozess Es kann sich im Schlafzustand (S) befinden, dh im Schlafzustand. Auch Prozesse in einem laufenden Zustand (R), die gerade ausgeführt werden oder ausgeführt werden, Prozesse, die warten (D) und nicht mehr darauf warten, besucht, gestpt (T) oder angehalten zu werden, sowie die Zombies (Z) oder Verstorbenen. Ein Zombie- oder toter Prozess wurde bereits erfolgreich beendet, bestimmte Systemressourcen wurden jedoch entführt, da Linux ihn weiterhin in der Prozesstabelle speichert. Sie wissen bereits, dass ein Prozess, wenn er endet, nicht in diesem Zustand bleiben sollte, sondern abgeschlossen ist und der Kernel die Ressourcen freigibt, damit andere Prozesse sie verwenden können. Im Grunde gibt er den belegten RAM frei ...

Nun, da es nicht interessant ist, diese Art von Zombie-Prozessen zu haben, obwohl sie nicht so häufig sind, können wir sie wie hier angegeben suchen und eliminieren. Als erstes müssen wir herausfinden, ob es in unserer Distribution Zombie-Prozesse gibt, und dafür können wir uns selbst helfen Werkzeuge wie oben oder wie ps. Zum Beispiel eine dieser beiden Optionen:

ps -el | grep 'Z'

ps aux | grep defunct

Und wenn wir es einmal entdeckt haben, können wir es töte ihn direkt mit:

kill -HUP `ps -A -ostat,ppid,pid,cmd | grep -e ‘^[Zz]’ | awk ‘{print $2}’`

Obwohl eine andere Alternative darin besteht, die übergeordneten Prozesse zu finden, da bis töte einen Zombie-Prozess Sie müssen die übergeordneten Prozesse beenden, die es unterstützen, wie Sie möglicherweise festgestellt haben:

ps -eo pid,ppid | grep <PID>

kill -9 <PPID>

Sie müssen ersetzen Verwenden Sie anhand der ID des Zombie-Prozesses, den Sie gefunden haben, und um ihn mit kill zu beenden, die ID des übergeordneten Prozesses, der ersetzt wird im Beispiel natürlich.


Hinterlasse einen Kommentar

Ihre E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert mit *

*

*

  1. Verantwortlich für die Daten: AB Internet Networks 2008 SL
  2. Zweck der Daten: Kontrolle von SPAM, Kommentarverwaltung.
  3. Legitimation: Ihre Zustimmung
  4. Übermittlung der Daten: Die Daten werden nur durch gesetzliche Verpflichtung an Dritte weitergegeben.
  5. Datenspeicherung: Von Occentus Networks (EU) gehostete Datenbank
  6. Rechte: Sie können Ihre Informationen jederzeit einschränken, wiederherstellen und löschen.

  1.   gemachte Bälle sagte

    Gute Seite!
    Sie befreien uns immer aus Schwierigkeiten.

    Wo sagt:
    Obwohl eine andere Alternative darin besteht, die übergeordneten Prozesse zu finden, müssen Sie, um einen Zombie-Prozess zu beenden, die übergeordneten Prozesse, die ihn unterstützen, beenden, wie Sie möglicherweise abgeleitet haben:

    1 | ps -eo pid, ppid | grep
    2|
    3 | töten -9

    Sie müssen die ID des gefundenen Zombie-Prozesses ersetzen und ihn mit kill beenden, verwenden Sie natürlich die ID des übergeordneten Prozesses, der im Beispiel ersetzt wird.

    Sie können das Skript hinzufügen:

    $cat killppid.sh
    #! / Bin / bash
    kill -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $ 2}')

    Natürlich ist es keine Aufgabe, die ein normaler Benutzer ständig ausführt.
    Es wäre nur für den Administrator nützlich, aber es ist gefährlich, es als Root auszuführen, da es jeden Prozess auf dem System beenden kann.

    In man kill hat es diese Anmerkung:

    HINWEISE Ihre Shell (Befehlszeileninterpreter) verfügt möglicherweise über einen integrierten Kill-Befehl. Du darfst
    müssen Sie den hier beschriebenen Befehl / bin / kill ausführen, um den Konflikt zu lösen.

    Bash hat diesen Befehl, das ist der Teil von man bash darüber:

    töten [-s Sigspec | -n Zeichen | -sigspec] [pid | Stellenbeschreibung] ...
    kill -l | -L [sigspec | exit_status]
    Senden Sie das Signal mit dem Namen sigspec oder signum an die Prozesse mit dem Namen pid oder job
    spez. sigspec ist entweder ein Signalname ohne Berücksichtigung der Groß-/Kleinschreibung wie SIGKILL (mit oder
    ohne SIG-Präfix) oder eine Signalnummer; signum ist eine Signalnummer. Wenn
    sigspec nicht vorhanden ist, wird SIGTERM angenommen. Ein Argument von -l listet die
    Signalnamen. Wenn bei der Angabe von -l Argumente angegeben werden, werden die Namen der
    den Argumenten entsprechende Signale werden aufgelistet und der Rückgabestatus ist 0.
    Das Argument exit_status für -l ist eine Zahl, die entweder eine Signalnummer oder . angibt
    der Exit-Status eines Prozesses, der durch ein Signal beendet wird. Die Option -L ist äquivalent
    verliehen an -l. kill gibt true zurück, wenn mindestens ein Signal erfolgreich gesendet wurde, oder
    false, wenn ein Fehler auftritt oder eine ungültige Option gefunden wird.

    Am Anfang erklären sie, wie die Bash die Prozesse schützt, um einige Probleme zu vermeiden, aber mir ist nicht klar, wie ich ein sicheres Skript erstellen könnte, das als Root ausgeführt wird.
    Ich kann mir nur vorstellen, es so zu schützen:

    $cat killppid.sh
    #! / Bin / bash
    if [$ USER == "root"]
    dann echo $ 0 nicht als root ausführen !!! es ist gefährlich!
    wunsch
    fi

    kill -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $ 2}')

    $

    Benutze bash's kill, nicht / bin / kill

    Wie können Sie sehen, dass ich mich mit Bash nicht so gut auskenne.
    Wissen Sie, wie man ein sicheres Skript schreibt, das als Benutzer des untergeordneten Prozesses ausgeführt wird, auch wenn es als Root ausgeführt wird?
    etwas Äquivalent zu dem, was manuell wie folgt gemacht werden würde:

    $su;
    $ kill -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $ 2}')