Linux-Prozesse verwalten und überwachen

LinuxBeginner
Jetzt üben

Einführung

In diesem Lab lernen Sie die wesentlichen Fähigkeiten zur Verwaltung und Überwachung von Prozessen auf einem Linux-System kennen. Sie werden untersuchen, wie Sie mit Prozessen interagieren, die sowohl im Vordergrund als auch im Hintergrund laufen, wodurch Sie mehr Kontrolle über Ihre Befehlszeilenumgebung und die Systemressourcen erhalten. Diese praktische Erfahrung ist für jeden grundlegend, der mit Linux arbeitet – vom Systemadministrator bis zum Entwickler.

Sie beginnen damit, einen Hintergrundjob mit dem Operator & zu starten und dessen Status mit jobs anzuzeigen. Anschließend inspizieren Sie laufende Prozesse mit ps, überwachen die Systemaktivität in Echtzeit mit top und üben die Job-Steuerung mit fg, bg und Ctrl-Z. Zum Abschluss des Labs lernen Sie, wie Sie die Priorität eines Prozesses mit renice anpassen und ihn mit dem Befehl kill beenden, womit der gesamte Lebenszyklus der Prozessverwaltung abgedeckt wird.

Einen Hintergrundprozess mit & und jobs starten und anzeigen

In diesem Schritt lernen Sie, wie Sie einen Befehl im Hintergrund ausführen und den Status von Hintergrundjobs anzeigen. In einer Linux-Shell führen Sie normalerweise einen Befehl aus und warten, bis er abgeschlossen ist, bevor die Eingabeaufforderung zurückkehrt. Dies wird als Ausführung eines Prozesses im Vorgeschmack (Vordergrund) bezeichnet. Bei zeitintensiven Aufgaben möchten Sie diese jedoch möglicherweise im Hintergrund ausführen lassen, damit Sie Ihr Terminal weiterhin für andere Befehle nutzen können.

Um einen Befehl im Hintergrund auszuführen, fügen Sie einfach ein kaufmännisches Und-Zeichen (&) am Ende der Befehlszeile hinzu. Probieren wir dies mit dem Befehl sleep aus, einem einfachen Dienstprogramm, das für eine festgelegte Zeit pausiert.

Führen Sie den folgenden Befehl aus, um sleep für 300 Sekunden im Hintergrund auszuführen. Dadurch können wir in den nächsten Schritten damit arbeiten.

sleep 300 &

Nachdem Sie die Eingabetaste (Enter) gedrückt haben, sehen Sie eine Ausgabe, die der folgenden ähnelt, und die Befehlszeile kehrt sofort zurück, sodass Sie neue Befehle eingeben können.

[1] 12345

Die Shell hat den Befehl sleep 300 als Hintergrundjob gestartet. Die Ausgabe liefert zwei wichtige Informationen:

  • [1]: Dies ist die Job-ID (Job-ID). Die Shell weist jedem Hintergrundprozess eine eindeutige Job-ID zu.
  • 12345: Dies ist die Prozess-ID (PID). Das Betriebssystem weist jedem laufenden Prozess eine eindeutige PID zu. Ihre PID wird sich von diesem Beispiel unterscheiden.

Da der Prozess nun im Hintergrund läuft, wie können Sie seinen Status überprüfen? Sie können den Befehl jobs verwenden, der alle Jobs auflistet, die im Hintergrund der aktuellen Shell-Sitzung ausgeführt werden.

Führen Sie den Befehl jobs in Ihrem Terminal aus:

jobs

Die Ausgabe zeigt Ihnen den gerade gestarteten sleep-Befehl zusammen mit seiner Job-ID und dem aktuellen Status.

[1]+  Running                 sleep 300 &

Sie haben erfolgreich einen Prozess im Hintergrund gestartet und wissen nun, wie Sie dessen Status überprüfen. Dies ist eine grundlegende Fähigkeit zur Verwaltung langlebiger Aufgaben auf einem Linux-System. In den nächsten Schritten werden wir untersuchen, wie Sie mit diesem Hintergrundjob interagieren.

Laufende Prozesse mit ps untersuchen

In diesem Schritt verwenden Sie den Befehl ps, um laufende Prozesse zu untersuchen. Im vorherigen Schritt haben Sie den Befehl jobs verwendet, um den Hintergrundprozess in Ihrer aktuellen Shell anzuzeigen. Allerdings ist jobs auf Ihre Sitzung beschränkt. Der Befehl ps bietet einen umfassenderen Schnappschuss der aktuellen Prozesse zu dem Zeitpunkt, zu dem Sie ihn ausführen.

Beginnen wir damit, ps ohne Optionen auszuführen. Dieser Befehl liefert einen Schnappschuss der Prozesse, die dem aktuellen Benutzer gehören und mit dem aktuellen Terminal verknüpft sind.

ps

Die Ausgabe fällt minimal aus und zeigt wahrscheinlich nur Ihre Shell (zsh) und den gerade ausgeführten ps-Befehl. Die PIDs werden auf Ihrem System abweichen.

  PID TTY          TIME CMD
23882 pts/0    00:00:00 zsh
23953 pts/0    00:00:00 ps

Um alle auf dem System laufenden Prozesse anzuzeigen und nicht nur die in Ihrem Terminal, können Sie ps mit Optionen verwenden. Eine sehr gängige und nützliche Kombination ist ps aux.

  • a: zeigt Prozesse für alle Benutzer an.
  • u: zeigt die Daten in einem benutzerorientierten Format an (zeigt Benutzer, CPU%, MEM% usw.).
  • x: schließt Prozesse ein, die nicht mit einem Terminal verknüpft sind.

Eine lange Liste von Prozessen ist nicht sehr hilfreich, wenn Sie nach etwas Bestimmtem suchen. Wir können ps mit dem Befehl grep kombinieren, um die Ausgabe zu filtern. Lassen Sie uns den sleep-Prozess finden, den Sie im vorherigen Schritt gestartet haben.

ps aux | grep sleep

Dieser Befehl filtert die Ausgabe von ps aux und zeigt nur die Zeilen an, die das Wort „sleep“ enthalten.

labex    23885  0.0  0.0   7264   868 pts/0    S    11:50   0:00 sleep 300
labex    23962  0.0  0.0  10788  2240 pts/0    S+   11:52   0:00 grep --color=auto sleep

Sie werden wahrscheinlich zwei Zeilen in der Ausgabe sehen. Die eine ist Ihr sleep 300-Prozess. Die andere ist der Befehl grep sleep selbst, der in dem Moment lief, als ps die Prozessliste erfasste. Beachten Sie, dass die PID für sleep 300 (in diesem Beispiel 23885) mit der übereinstimmt, die Sie gesehen haben, als Sie den Befehl zum ersten Mal im Hintergrund ausgeführt haben.

Ein weiteres beliebtes Format zum Anzeigen von Prozessen ist ps -ef.

  • -e: wählt jeden Prozess auf dem System aus.
  • -f: zeigt eine „vollständige“ Formatübersicht (Full-Format Listing) an, die nützliche Informationen wie die Eltern-Prozess-ID (PPID) enthält.

Probieren wir es aus, indem wir erneut grep verwenden, um unseren sleep-Prozess zu finden.

ps -ef | grep sleep

Das Ausgabeformat ist anders, liefert aber ähnliche Informationen. Diese Ansicht ist besonders nützlich, um die Prozesshierarchie über die Spalten PID und PPID zu erkennen.

UID        PID  PPID  C STIME TTY          TIME CMD
labex    23885 23882  0 11:50 pts/0    00:00:00 sleep 300
labex    23964 23882  0 11:53 pts/0    00:00:00 grep --color=auto sleep

Sie haben nun gesehen, wie Sie mit ps einen Schnappschuss der Systemprozesse erstellen. Durch die Kombination mit Tools wie grep können Sie bestimmte Prozesse schnell finden und überprüfen.

Systemressourcen mit top überwachen

In diesem Schritt lernen Sie, wie Sie top verwenden, ein leistungsstarkes Werkzeug zur Systemüberwachung in Echtzeit. Während ps Ihnen einen statischen Schnappschuss von Prozessen liefert, bietet top eine dynamische, kontinuierlich aktualisierte Ansicht der Systemaktivität. Dies macht es von unschätzbarem Wert, um ressourcenintensive Prozesse sofort zu identifizieren.

Geben Sie zu Beginn einfach top in Ihr Terminal ein und drücken Sie die Eingabetaste.

top

Ihr gesamtes Terminalfenster wird von der top-Benutzeroberfläche übernommen. Es sieht in etwa so aus, wobei sich die Daten alle paar Sekunden aktualisieren.

top - 12:05:15 up 15 min,  1 user,  load average: 0.00, 0.01, 0.00
Tasks: 115 total,   1 running, 114 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.1 us,  0.1 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :   1987.2 total,    985.4 free,    501.8 used,    500.0 buff/cache
MiB Swap:   2048.0 total,   2048.0 free,      0.0 used.   1325.4 avail Mem

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
      1 root      20   0  167900  12936   8488 S   0.0   0.6   0:01.15 systemd
      2 root      20   0       0      0      0 S   0.0   0.0   0:00.00 kthreadd
...

Die top-Oberfläche ist in zwei Hauptteile unterteilt:

  • Der Zusammenfassungsbereich (Summary Area) oben zeigt systemweite Statistiken wie Betriebszeit (Uptime), Anzahl der Aufgaben, CPU-Auslastung (%Cpu(s)) und Speichernutzung (MiB Mem).
  • Die Prozessliste darunter zeigt einzelne Prozesse an, standardmäßig sortiert nach CPU-Auslastung (%CPU).

Der Befehl top ist interaktiv. Sie können verschiedene Tastenanschläge verwenden, um sein Verhalten zu ändern. Probieren wir einige aus:

Drücken Sie M (Großbuchstabe 'M'), um nach Speichernutzung zu sortieren. Die Liste wird anhand der Spalte %MEM neu sortiert, sodass die speicherintensivsten Prozesse ganz oben stehen.

Drücken Sie P (Großbuchstabe 'P'), um nach CPU-Auslastung zu sortieren. Dadurch wird die Liste wieder in die Standardansicht nach der Spalte %CPU zurückversetzt.

Versuchen Sie, den zuvor gestarteten sleep-Prozess zu finden. Er befindet sich wahrscheinlich weit unten in der Liste, da er keine CPU beansprucht. Sie können die Pfeiltasten Nach unten und Nach oben verwenden, um durch die Prozessliste zu scrollen.

Wenn Sie mit der Beobachtung fertig sind, können Sie top jederzeit verlassen.

Drücken Sie q, um die top-Oberfläche zu beenden und zu Ihrer Befehlszeile zurückzukehren.

Sie haben top nun verwendet, um eine Echtzeitansicht der Prozesse und der Ressourcennutzung Ihres Systems zu erhalten. Dies ist der Standardbefehl für jeden Systemadministrator bei der Fehlerbehebung von Leistungsproblemen.

Job-Steuerung mit fg, bg und Strg-Z (Ctrl-Z) verwalten

In diesem Schritt lernen Sie, wie Sie den Status Ihrer laufenden Jobs verwalten. Sie wissen bereits, wie man einen Job im Hintergrund startet, aber was ist, wenn Sie einen langwierigen Befehl im Vordergrund starten und dann feststellen, dass Sie Ihr Terminal zurück benötigen? Die Job-Steuerung ermöglicht es Ihnen, Prozesse zwischen Vorder- und Hintergrund zu verschieben sowie sie anzuhalten (zu stoppen) und fortzusetzen.

Arbeiten wir mit dem zuvor gestarteten sleep 300-Prozess. Überprüfen Sie zunächst seinen Status mit dem Befehl jobs, um sicherzustellen, dass er noch läuft.

jobs

Sie sollten Ihren sleep-Job im Hintergrund laufen sehen.

[1]  + running    sleep 300

Bringen Sie diesen Job nun in den Vordergrund. Verwenden Sie dazu den Befehl fg (foreground), gefolgt von der Job-ID mit einem vorangestellten %. Da unsere Job-ID 1 lautet, lautet der Befehl:

fg %1

Die Shell zeigt den Befehlsnamen zusammen mit zusätzlichen Job-Informationen an, und Ihre Eingabeaufforderung verschwindet. Das Terminal ist nun durch den Befehl sleep 300 „belegt“, der auf seine Beendigung wartet.

[1]  + 394 running    sleep 300

Um Ihr Terminal zurückzubekommen, ohne den Prozess zu töten, können Sie ihn anhalten (stop). Drücken Sie die Tastenkombination Ctrl-Z (halten Sie die Ctrl-Taste gedrückt und drücken Sie Z).

Diese Aktion sendet ein spezielles Signal (SIGTSTP) an den Prozess, das seine Ausführung unterbricht. Der Prozess wird nicht beendet; er wird lediglich angehalten. Sie sehen eine Meldung, die dies bestätigt, und Ihre Eingabeaufforderung kehrt zurück.

[1]  + 394 suspended  sleep 300

Überprüfen Sie nun erneut den Status Ihrer Jobs:

jobs

Die Ausgabe zeigt den Status des Jobs nun als „suspended“ (angehalten) an.

[1]  + suspended  sleep 300

Ein gestoppter Job kann fortgesetzt werden. Sie können ihn im Vordergrund mit fg oder im Hintergrund mit bg fortsetzen. Setzen wir ihn mit dem Befehl bg im Hintergrund fort.

bg %1

Die Shell bestätigt, dass der Job nun wieder im Hintergrund läuft.

[1]  + 394 continued  sleep 300

Sie können seinen Status ein letztes Mal mit jobs überprüfen, um zu sehen, dass er wieder auf „Running“ steht. Sie haben nun erfolgreich einen Prozess aus dem Hintergrund in den Vordergrund verschoben, ihn angehalten und im Hintergrund fortgesetzt.

Prozesspriorität mit renice anpassen

In diesem Schritt lernen Sie, wie Sie die Planungspriorität (Scheduling Priority) eines laufenden Prozesses beeinflussen können. Unter Linux bestimmt die „Nettigkeit“ (Niceness) eines Prozesses, wie viel CPU-Zeit er im Vergleich zu anderen Prozessen erhält. Der Niceness-Wert reicht von -20 (höchste Priorität) bis +19 (niedrigste Priorität). Standardmäßig starten die meisten Prozesse mit einem Niceness-Wert von 0. Ein höherer Niceness-Wert bedeutet, dass der Prozess „netter“ zu anderen Prozessen ist und CPU-Zeit bereitwilliger abgibt.

Wir passen die Priorität des sleep-Prozesses an, mit dem Sie gearbeitet haben. Dazu benötigen Sie zunächst dessen Prozess-ID (PID). Sie können diese wieder mit ps und grep finden.

ps aux | grep sleep

Suchen Sie nach der Zeile, die zu sleep 300 gehört (nicht dem grep-Befehl selbst), und notieren Sie sich deren PID aus der zweiten Spalte.

labex    23885  0.0  0.0   7264   868 pts/0    S    11:50   0:00 sleep 300
labex    24101  0.0  0.0  10788  2240 pts/0    S+   12:15   0:00 grep --color=auto sleep

In diesem Beispiel lautet die PID 23885. Sie müssen die PID aus Ihrer eigenen Ausgabe in den folgenden Befehlen verwenden.

Überprüfen wir nun den aktuellen Niceness-Wert (NI) des Prozesses. Der Befehl ps mit der Option -o ermöglicht es Ihnen, benutzerdefinierte Ausgab Spalten anzugeben.

ps -o pid,ni,cmd -p <YOUR_PID>

Ersetzen Sie <YOUR_PID> durch die tatsächliche PID Ihres sleep-Prozesses. Zum Beispiel: ps -o pid,ni,cmd -p 23885.

    PID  NI CMD
  23885   0 sleep 300

Wie erwartet ist der Standard-Niceness-Wert (NI) 0.

Ändern wir nun diesen Wert mit dem Befehl renice. Wir erhöhen den Niceness-Wert auf 10, wodurch sich die Priorität des Prozesses verringert. Normale Benutzer können nur den Niceness-Wert ihrer eigenen Prozesse erhöhen (und sie so auf eine niedrigere Priorität setzen).

renice -n 10 -p <YOUR_PID>

Ersetzen Sie auch hier <YOUR_PID> durch die PID Ihres Prozesses. Der Befehl meldet die alte und die neue Priorität.

23885 (process ID) old priority 0, new priority 10

Überprüfen Sie abschließend, ob die Änderung wirksam geworden ist, indem Sie den Befehl ps erneut ausführen:

ps -o pid,ni,cmd -p <YOUR_PID>

Die Ausgabe sollte nun den neuen Niceness-Wert anzeigen.

    PID  NI CMD
  23885  10 sleep 300

Sie haben die Priorität eines laufenden Prozesses erfolgreich geändert. Dies ist eine nützliche Technik, um sicherzustellen, dass langsame, nicht kritische Hintergrundaufgaben wichtigere Vordergrundarbeiten nicht beeinträchtigen.

Einen Prozess mit kill beenden

In diesem Schritt lernen Sie, wie Sie einen Prozess beenden. Während einige Prozesse von alleine enden, müssen Sie häufig einen Prozess manuell stoppen, der nicht mehr benötigt wird, sich fehlerhaft verhält oder für temporäre Zwecke gestartet wurde (wie unser sleep-Befehl). Das primäre Werkzeug dafür ist der Befehl kill.

Der Befehl kill sendet ein Signal an einen angegebenen Prozess. Standardmäßig sendet er das Signal SIGTERM (terminate), das den Prozess höflich auffordert, sich herunterzufahren, sodass er vor dem Beenden eventuelle Aufräumarbeiten durchführen kann.

Sie können einen Prozess entweder über seine Prozess-ID (PID) oder – bei Hintergrundjobs in Ihrer aktuellen Shell – über seine Job-ID ansprechen. Die Verwendung der Job-ID ist oft praktischer.

Lassen Sie uns zunächst bestätigen, dass unser sleep-Job noch läuft.

jobs

Sie sollten den aufgelisteten sleep-Prozess sehen.

[1]+  Running                 sleep 300 &

Verwenden Sie nun den Befehl kill mit der Job-ID (%1), um ihn zu beenden.

kill %1

Nachdem Sie den Befehl ausgeführt haben, gibt die Shell wahrscheinlich eine Meldung im Terminal aus, die besagt, dass der Job beendet wurde. Diese Meldung wird möglicherweise sofort oder erst nach erneutem Drücken der Eingabetaste angezeigt.

[1]+  Terminated              sleep 300

Lassen Sie uns überprüfen, ob der Prozess wirklich verschwunden ist. Führen Sie den Befehl jobs erneut aus.

jobs

Der Befehl sollte nun keine Ausgabe mehr liefern, da sich keine aktiven Jobs mehr in dieser Shell-Sitzung befinden. Sie können auch ps verwenden, um dies doppelt zu überprüfen.

ps aux | grep sleep

Die einzige Zeile, die Sie möglicherweise sehen, ist der grep sleep-Befehl selbst. Der ursprüngliche sleep 300-Prozess läuft nicht mehr.

In Fällen, in denen ein Prozess nicht reagiert und auf das Standard-SIGTERM-Signal nicht anspricht, können Sie ein drastischeres Signal senden: SIGKILL (Signalnummer 9), welches den Prozess sofort beendet, ohne ihm die Möglichkeit zu geben, aufzuräumen. Der Befehl dazu lautet kill -9 %1. Dies sollte jedoch nur als letztes Mittel eingesetzt werden.

Herzlichen Glückwunsch! Sie haben nun den vollständigen Lebenszyklus der grundlegenden Prozessverwaltung unter Linux geübt: das Starten eines Prozesses im Hintergrund, das Untersuchen mit ps und top, das Verwalten über die Job-Steuerung, das Anpassen der Priorität und schließlich das Beenden.

Zusammenfassung

In diesem Lab haben Sie die grundlegenden Fähigkeiten zur Verwaltung und Überwachung von Prozessen in einer Linux-Umgebung erlernt. Sie begannen damit, einen Prozess im Hintergrund über den Operator & auszuführen und dessen Status mit dem Befehl jobs anzuzeigen. Danach haben Sie untersucht, wie Sie alle laufenden Prozesse mit ps inspizieren, um Details wie die Prozess-ID (PID) zu finden, und wie Sie top für die Echtzeitüberwachung der Systemressourcennutzung und der aktiven Prozesse verwenden.

Darüber hinaus haben Sie die Job-Steuerung geübt, indem Sie einen Vordergrundprozess mit Ctrl-Z angehalten, ihn mit bg in den Hintergrund verschoben und mit fg in den Vordergrund zurückgeholt haben. Sie haben auch gelernt, wie Sie die Planungspriorität eines Prozesses mit renice anpassen und wie Sie einen Prozess mithilfe seiner PID und des Befehls kill ordnungsgemäß beenden.