Linux-Tutorial / Prozesse untersuchen, pausieren und stoppen
Um Linux-Prozesse zu verwalten, identifizieren Sie das laufende Programm, prüfen Sie seinen Zustand und die Ressourcennutzung und senden Sie ein Signal nur, wenn ein Eingreifen erforderlich ist. ps liefert einen Schnappschuss; top aktualisiert die Ansicht. Um einen Prozess zu beenden, fordern Sie zunächst mit TERM ein normales Herunterfahren an. Reservieren Sie das unfangbare KILL-Signal für Fälle, in denen sicherere Schritte fehlgeschlagen sind.
In dieser Lektion werden Prozesszustände, Jobsteuerung und Signale geübt. Reparenting, Zombies und PID-Namespaces werden im PID- und PPID-Zusatz behandelt.
Unterscheiden Sie Prozesse von Shell-Jobs
Ein Prozess ist eine Instanz eines laufenden Programms und hat eine PID (Prozess-ID). Seine PPID (Elternprozess-ID) identifiziert seinen Elternprozess. Ein Job ist eine Einheit, die von einer Shell verfolgt wird; er kann mehr als einen Prozess enthalten. Eine Job-ID wie %1 gehört zur Jobsteuerung dieser Shell und ist nicht dasselbe wie eine systemweite PID.
Einige Prozesse gehören zu Diensten, aber nicht jeder Prozess ist ein Dienst. Bevor man den einzelnen Prozess eines Dienstes beendet, sollte man seinen Zustand und seine Protokolle über den Dienstmanager prüfen. Diese Lektion konzentriert sich darauf, einen Übungsprozess zu beobachten und zu steuern, der Ihrem Benutzerkonto gehört.
Wählen Sie nützliche Spalten mit ps aus
ps meldet Prozesse in dem Moment, in dem es ausgeführt wird. Für eine systemweite Ansicht erleichtern explizite Spalten den Vergleich von PID, übergeordnetem Prozess, Besitzer, Status, verstrichener Zeit und Befehl. Die vollständige Liste kann lang sein, daher sollte sie nach Möglichkeit auf eine bekannte PID oder ein bekanntes Programm eingegrenzt werden.
ps -eo pid,ppid,user,stat,etime,args ps -eo pid,ppid,user,%cpu,%mem,stat,args --sort=-%cpu | head
Das zweite Beispiel sortiert nach gemeldeter CPU-Auslastung und zeigt die ersten Zeilen. CPU-Zahlen hängen davon ab, wie und wann sie gemessen werden; eine einzige Momentaufnahme ist kein Beweis für die Ursache einer Verlangsamung. Das erste Zeichen von STAT bedeutet häufig: R, laufend oder bereit; S, unterbrechbarer Schlaf; D, normalerweise ununterbrechbarer Schlaf; T, gestoppt; oder Z, ein beendetes Kind, dessen Status vom übergeordneten Prozess noch nicht abgeholt wurde. Zusätzliche Zeichen können andere Eigenschaften beschreiben.
Änderungen mit top beobachten und Kandidaten mit pgrep finden
top aktualisiert die Prozessliste und Ressourcenzahlen regelmäßig. Sortierung und angezeigte Werte hängen von seiner Konfiguration ab. Drücken Sie q, um zu beenden. Es ist nützlich, wenn Sie einen Trend beobachten müssen, anstatt ps wiederholt aufzurufen.
top
pgrep kann PIDs nach Namen finden; -a beinhaltet die Kommandozeile. Mehrere ähnlich benannte Prozesse können existieren, und ein Prozess kann sofort nach der Suche beendet werden oder seine PID kann später wiederverwendet werden. Stoppen Sie einen Prozess niemals nur weil eine Zahl in einem Suchergebnis aufgetaucht ist.
pgrep -a sleep
Wenn nichts zurückgegeben wird, gibt es möglicherweise keine Übereinstimmung, die Sichtbarkeit ist eingeschränkt oder der Suchausdruck ist falsch. Um Ihren eigenen Testprozess zu beobachten, ist die PID, die von der Shell in der nächsten Übung erfasst wird, ein klareres Ziel.
Pausieren und Fortsetzen Ihres eigenen Prozesses
Führen Sie Folgendes in Bash aus. sleep 300 & startet einen 300-Sekunden-Schläfer im Hintergrund; $! erweitert sich auf die PID des neuesten Hintergrundjobs. Üben Sie diese Signale nicht an den Prozessen einer anderen Person oder einem Produktionsdienst. Bleiben Sie in derselben Shell, bis die Übung abgeschlossen ist, damit Sie die Übungs-PID behalten.
sleep 300 & practice_pid=$! printf 'practice PID: %s\n' "$practice_pid" ps -p "$practice_pid" -o pid,ppid,stat,etime,args kill -STOP "$practice_pid" ps -p "$practice_pid" -o pid,stat,args kill -CONT "$practice_pid" ps -p "$practice_pid" -o pid,stat,args
Die erste ps sollte das beabsichtigte sleep identifizieren. Nach STOP beginnt der Zustand üblicherweise mit T; nach CONT kann er zu S oder einem anderen Zustand zurückkehren. Die genaue Beobachtung hängt vom Timing ab. STOP setzt die Ausführung aus, ohne den Prozess zu beenden; CONT setzt sie fort.
Fordern Sie die Beendigung mit TERM an und überprüfen Sie dies
Beenden Sie die Übung in derselben Shell. TERM ist die standardmäßige Beendigungsanforderung und gibt einem Programm die Möglichkeit zur Bereinigung. wait wartet auf dieses Kind und sammelt dessen Exit-Status. Da es von einem Signal beendet wurde, kann wait selbst einen nicht null Status zurückgeben.
kill -TERM "$practice_pid" wait "$practice_pid" ps -p "$practice_pid" -o pid,stat,args
Wenn das letzte ps nur seinen Header anzeigt oder keinen passenden Prozess meldet, ist der Übungsprozess normalerweise beendet. PIDs können wiederverwendet werden, daher beweist das spätere Auftreten derselben Nummer nicht, dass es derselbe Prozess ist. Wenn ein Programm TERM behandelt oder ignoriert, geben Sie ihm Zeit und überprüfen Sie seinen Zustand und seine Protokolle.
kill -KILL PID gibt einem Prozess keine Chance, dieses Signal zu verarbeiten oder sich selbst aufzuräumen. Es kann eine Datenbank, einen aktiven Schreibvorgang oder einen Dienst in einen inkonsistenten Zustand versetzen. Berücksichtigen Sie es nur, wenn die Identität und die Folgen klar sind und die normale Beendigung fehlgeschlagen ist. Normale Benutzer können keine Signale an Prozesse senden, die ihnen nicht gehören. Eine Aufgabe im D-Zustand kann nicht sofort verschwinden, selbst nach einem erzwingenden Signal.
Vordergrund- und Hintergrundaufgaben in der Shell
In Bash startet command & einen Hintergrundjob. jobs -l listet die Jobnummern und PIDs auf, die von der aktuellen Shell verfolgt werden, nicht alle Prozesse auf dem Computer oder Jobs in einem anderen Terminal. Wenn Sie einen Vordergrundjob mit Ctrl+Z anhalten, kann bg %1 ihn im Hintergrund fortsetzen und fg %1 kann ihn in den Vordergrund bringen. Wählen Sie die tatsächliche Jobnummer aus jobs; gehen Sie nicht davon aus, dass es immer 1 ist.
jobs -l
Ein Programm im Shell-Hintergrund zu starten, macht es nicht zu einem zuverlässigen Dienst, der das Abmelden überlebt. Es kann weiterhin von der Sitzung, seiner Eingabe und Ausgabe und Signalen beeinflusst werden. Verwenden Sie den Service-Management-Mechanismus der Distribution für einen Serverprozess, der kontinuierliche Verwaltung benötigt.
Eine Diagnoseabfolge für einen problematischen Prozess
- Verwenden Sie
psoderpgrep, um PID, Befehl, Eigentümer und übergeordneten Prozess zu bestätigen. Leiten Sie die Identität nicht aus einem ähnlichen Namen ab. - Verwenden Sie
topund relevante Protokolle, um festzustellen, ob die Ressourcennutzung anhält, die Aufgabe lediglich wartet oder ein tatsächlicher Fehler vorliegt. - Finden Sie heraus, ob ein Dienstmanager Eigentümer ist. Wenn ja, überprüfen Sie den Dienststatus und die Protokolle, bevor Sie einen untergeordneten Prozess manipulieren.
- Wenn ein von Ihnen besessener Prozess gestoppt werden muss, fordern Sie
TERMan und geben Sie Zeit zur Bereinigung. Eskalieren Sie nur, wenn nötig. - Überprüfen Sie erneut mit
psund untersuchen Sie dann Neustarts, Wiederholungen und die zugrunde liegende Ursache.
Offizielle Referenzen
Das ps(1)-Handbuch definiert seine Felder und Zustandscodes. Siehe das pgrep(1)-Handbuch für Suchoptionen und das kill(1)-Handbuch für Signale. Die GNU Bash Job-Control-Dokumentation behandelt Jobnummern, fg und bg.




