Was ist los auf dem Linux-Rechner? Verschiedene Shell-Kommandos verraten etwas über die Prozesse des Systems und helfen bei der Steuerung.
Immer, wenn Sie (oder eine Anwendung) ein Programm aufrufen, startet das Betriebssystem einen oder mehrere Prozesse. Diese durchleben verschiedene Zustände: Sie können verarbeitet, angehalten, wieder reaktiviert und in der Regel auch beendet werden. Linux bietet für Prozesse eine Art Zugangsbeschränkung: Sie anhalten, fortsetzen oder beenden darf immer nur der Benutzer, der sie gestartet hat. Eine Ausnahme macht der Benutzer root: Er darf alle Prozesse eines Systems steuern. Darüber hinaus gibt es Prozesse, die unter einer Kennung eines so genannten Systembenutzers, wie nobody oder lp, laufen – auch auf diese hat nur root vollen Zugriff. Diese Zu-Befehl-Folge zeigt Tools, mit denen Sie mehr über Prozesse herausfinden und diese steuern.
Eine große Familie
Prozesse sind nicht alleine, sondern befinden sich immer in guter Gesellschaft. Tatsächlich handelt es sich um eine hierarchische Struktur: Ganz oben steht init mit der Prozessnummer 1; es handelt sich um den ersten Prozess, den Linux nach dem Booten startet. Von diesem “Vorfahren” stammen alle weiteren Prozesse ab – init startet die elementaren Programme des Betriebssystems. Den Zusammenhang zwischen “Eltern” und “Kindern” zeigt das Programm pstree. In dieser Baumstruktur erkennen Sie auf einen Blick, wer von wem abstammt (Abbildung 1).

init) stammen alle weiteren Prozesse ab.” width=”300″ height=”237″ />
Abbildung 1: Pstree zeigt auf der Shell die Verwandtschaftsverhältnisse. Vom ersten Prozess des Systems (init) stammen alle weiteren Prozesse ab. Noch ausführlicher gestaltet das Tool seine Ausgabe, wenn Sie die Option -a beim Start mit übergeben. Jetzt zeigt Pstree zusätzlich die Parameter, mit denen die Programme laufen. Verwenden Sie ein Terminal wie das Gnome-Terminal oder die KDE-Konsole, das verschiedene Fonts (und auch die Darstellung in Fettschrift) anbietet, probieren Sie doch mal den Parameter -h: Pstree setzt nun ein Highlight für seinen eigenen Prozess und die Vorfahren. Möchten Sie das praktische Feature auch gerne für andere Prozesse nutzen, verwenden Sie -H zusammen mit der Prozessnummer, und Pstree hebt den angegebenen Prozess und seine Verwandten hervor. Die Prozessnummer (PID) verrät Pstree über die Option -p und den Benutzer über -u. Alle Parameter dürfen Sie auch kombinieren, wie etwa zu pstree -apu.
Prozesse auflisten mit Ps
Eine Liste aller gerade auf dem System laufenden Prozesse zeigt das Kommando ps an. Ohne weitere Parameter beschränkt sich das Tool auf die Prozesse der aktuellen Shell. Wer sich für alle eigenen Prozesse interessiert, ruft ps zusammen mit der Option x auf (Listing 1). Die tabellarische Ausgabe in der Shell gibt Auskunft zu den folgenden Eigenschaften:
PID: Die Prozessnummer (“process identifier”), eine eindeutige Nummer, über die Sie einen Prozess gezielt ansprechen.TTY: Das Terminal oder Konsole, aus der der Prozess heraus gestartet wurde (ein Fragezeichen bedeutet, dass der Prozess nicht in einem Terminal läuft)STAT: Der Status des Prozesses. Hier tauchen beispielsweise die ZuständeS(“sleeping” = “schlafend”),R(“running” = läuft gerade),D(“dead” = Prozess ist nicht mehr wieder aufzuwecken) oderZ(“zombie” = ein abgelaufener Prozess, der seinen Rückgabestatus nicht mehr richtig übergeben konnte) auf.TIME: Die verbrauchte Rechenzeit.COMMAND: Der vollständige Befehl mit allen Aufrufparametern.
$ ps x PID TTY STAT TIME COMMAND 3011 ? Ss 0:00 /usr/bin/gnome-session 3061 ? S 0:00 /usr/bin/dbus-launch --exit-with-session /usr/bin/gnome-session […] 3086 ? Ssl 0:02 gnome-panel --sm-client-id default1 3088 ? Ssl 0:02 nautilus --no-default-window --sm-client-id default2
Für ps stehen jede Menge weitere Optionen zur Verfügung, mit denen Sie die Ausgabe noch informativer gestalten. So zeigt u zusätzlich den Eigentümer und die Rechenzeit beziehungsweise den Speicheranteil an; a blendet hingegen eine Liste aller Prozesse sämtlicher Benutzer ein. Ebenfalls praktisch ist l: In dieser langen Ausgabe sehen Sie zusätzliche Infos, unter anderem zur PPID (“parent process identifier”), also zum “Elternprozess”, und zur UID, also zur User Identification des aufrufenden Benutzers. Um die teilweise recht langen Aufrufparameter der Spalte COMMAND vollständig anzuzeigen, setzen Sie w ein – die Option verlängert die Ausgabe und darf auch mehrfach verwendet werden. Alle Parameter kombinieren Sie nach Lust und Laune, wie beispielsweise in Abbildung 2 zu sehen.

ps zeigt, was auf dem Rechner los ist.” width=”300″ height=”244″ />
Abbildung 2: Das Kommandops zeigt, was auf dem Rechner los ist.TIPP
In der Spalte COMMAND zeigt ps den vollständigen Befehlsaufruf an. Einige Programme, wie etwa der Downloadmanager wget, nehmen auf der Shell optional schon Passwörter zur Authentifizierung entgegen. Auch dieses Kennwort taucht in der Prozessliste als Kommando auf – so kann theoretisch jeder Benutzer des Systems sensible Daten ausspionieren.
Vorder- und Hintergründiges
Es kann vorkommen, dass ein in der Shell gestartetes Programm einmal etwas länger läuft. Auch grafische Programme, die Sie aus einem Terminalfenster heraus starten, blockieren die Shell und verhindern damit weitere Befehlseingaben. In einem solchen Fall können Sie entweder abwarten und Tee trinken oder eine zweite Konsole öffnen und darin weiterarbeiten. Alternativ befördern Sie einen Prozess schon beim Start oder nachträglich in den Hintergrund.
Um einen Prozess schon beim Start in den Hintergrund zu legen, hängen Sie direkt an den Befehl ein Kaufmannsund-Zeichen (“&”) an (Listing 2, Zeile 1). Das Xpdf-Fenster startet, die Shell verrät die Prozess-ID (5622), und die Bash ist bereit, weitere Befehle entgegen zu nehmen.
Außer der Prozessnummer erfahren Sie hier in eckigen Klammern die so genannte Job-ID: Bei Letzterer handelt es sich um eine von der Shell vergebene fortlaufende Job-Nummer. Starten Sie ein weiteres Programm in dieser Sitzung, so sehen Sie, dass die Bash die Nummer 2 vergibt (Listing 2, Zeile 3). Welche Jobs derzeit in einer Shell laufen, verrät das gleichnamige Kommando jobs (Listing 2, Zeile 6).
$ xpdf article.pdf & [1] 5622 $ audacity & [2] 6559 […] $ jobs [1] Running xpdf article.pdf & [2]- Running audacity & [3]+ Running sleep 3600 &
Hat ein Programm seine Arbeit beendet, verrät die Shell das durch Einblenden der Job-Nummer, der Statusmeldung Done (“erledigt”) und des Programmnamens:
[3]+ Done xpdf article.pdf
Die Job-Nummer erweist sich als nützlich, wenn es darum geht, gezielt Prozesse der Shell in den Vordergrund zu holen und in den Hintergrund zu legen. Haben Sie ein Programm ohne angehängtes Kaufmannsund-Zeichen gestartet, legen Sie es mit der Tastenkombination [Strg]+[Z] schlafen. Als Bestätigung zeigt die Shell:
[1]+ Stopped xpdf
Tippen Sie nun bg (“background” = Hintergrund), läuft der Prozess im Hintergrund weiter. Befinden sich in der Shell bereits mehrere angehaltene Prozesse, kommt die Job-ID ins Spiel. Das Kommando bg %3 teilt dem Prozess mit der Job-ID [ 3] mit, dass er im Hintergrund wieder seinen Dienst aufnehmen soll. Entsprechend bringt das Kommando fg (“foreground”) Jobs wieder in den Vordergrund; auch dieses Programm erwartet im Zweifelsfall eine genaue Anweisung der Job-ID nach einem Prozentzeichen.
Abgekoppelt
Die im vorigen Abschnitt vorgestellten Befehle stellen Prozesse in den Hintergrund und lassen sie optional dort weiterarbeiten. Schließen Sie hingegen die Shell, aus der heraus Sie das Programm gestartet haben, bedeutet das auch das Ende für alle dort laufenden Prozesse. Das Programm nohup bietet einen Ausweg: Es schützt den Prozess vor dem HUP-Signal der Shell (siehe nächster Abschnitt), so dass er nach dem Schließen der Terminalsitzung ungehindert weiter arbeiten kann – ein Abnabelungsprozess des Kindes vom Elternprozess also. Rufen Sie nohup einfach zusammen mit dem Programm (und seinen Optionen) auf:
nohup find /scratch3/mp3 -name "*.ogg" > ogg_liste.txt
Dieses Vorgehen stellt den Prozess nicht automatisch in den Hintergrund: Dafür sorgen Sie über die im vorigen Abschnitt vorgestellten Methoden selbst. Ist die Shell geschlossen, haben Sie keine Möglichkeit mehr, mit dem Prozess zu kommunizieren – oder? Auch wenn die direkte Verbindung zum Terminal fehlt, steuern Sie das Programm über die im nächsten Abschnitt vorgestellten Signale.
Alles hat ein Ende?
Anders als der Name vermuten lässt, tötet das Programm kill nicht nur einfach. Vielmehr verwenden Sie es, um Signale an Prozesse zu schicken – dazu gehört natürlich auch eine Aufforderung zum Niederlegen der Arbeit. Wie zu erwarten, dürfen Sie als normaler Benutzer lediglich mit ihren eigenen Prozessen kommunizieren. Nur der Administrator root darf allen Prozessen des Systems Signale senden. Welche Anweisungen kill übermittelt, zeigen Sie über den Befehl kill -l an. Interessant für den täglichen Prozessdschungel sind zum Beispiel:
SIGHUP: Der Prozess soll nach dem Beenden direkt neu starten. Das wird oft verwendet, um Konfigurationsdateien von Serverdiensten neu einzulesen.SIGTERM: Diese Aufforderung zum Beenden gibt dem Prozess die Möglichkeit, hinter sich aufzuräumen.SIGKILL: Dieses Signal zwingt einen Prozess zum Beenden ohne Rücksicht auf Verluste. Manchmal hilft auch das nicht, um Prozesse loszuwerden. War auch das Warten auf einen Timeout erfolglos, bleibt ein Rechnerneustart die einzige Lösung.SIGSTOP: Das unterbricht die Arbeit eines Prozesses, bis Sie ihn mitSIGCONTwieder fortsetzen.
Um ein Signal an einen Prozess zu senden, geben Sie entweder den Namen oder die Nummer des Signals gefolgt von der Prozess-ID an, zum Beispiel kill -19 9201. Auch die Angabe mehrerer Prozessnummern ist erlaubt. Ohne einen Parameter und nur mit der PID zusammen aufgerufen, schickt kill an den Prozess das SIGTERM-Signal.
Gesucht, gefunden
Um die passenden Prozessnummern herauszufischen, setzen Sie wie gezeigt ps ein. Das Shell-Kommando können Sie wie gewohnt mit anderen Tools, zum Beispiel grep, kombinieren. So suchen Sie beispielsweise nach allen Prozessen mit ssh im Namen (Listing 3).
$ ps aux | grep ssh root 2816 … 0:00 /usr/sbin/sshd huhn 3992 … 0:00 ssh -X huhn@asteroid huhn 4249 … 0:00 ssh huhn@macnugget
Neben dem SSH-Server (sshd) tauchen in der Liste sämtliche SSH-Verbindungen auf. Um allen diesen Prozessen dasselbe Signal zu schicken, hängen Sie im kill-Aufruf alle PIDs hintereinander – bei einer langen Liste ist das etwas umständlich. Einen Ausweg bietet der Befehl killall: Das Tool versteht alle Kill-Signale, erwartet aber anstelle der Prozessnummern die Namen.
Das Kommando killall -19 ssh schickt an alle SSH-Verbindungen die Aufforderung zum Schlafen (SIGSTOP). Ohne Angabe des Signals geht Killall genau wie Kill davon aus, dass Sie SIGTERM meinen. Da Killall tatsächlich einen Rundumschlag ausführt, schalten Sie mit der Option -i in den interaktiven Modus, und das Tool fragt für jeden Prozess nach, ob es ihn tatsächlich terminieren soll.
Noch mehr Spürnasen
Bei der Fahndung nach den Prozessnummern leistet eine Kombination aus ps und grep gute Dienste – Tipparbeit sparen Sie, wenn Sie direkt auf pgrep als Spürnase setzen. Um nach allen Prozessen zu suchen, die ssh im Namen tragen, tippen Sie:
$ pgrep ssh 2816 3992 4249
Darf es etwas mehr Kontext sein, fügen Sie den Parameter -l hinzu, und Pgrep verrät zusätzlich den Namen. Um hingegen den vollständigen Befehlsaufruf inklusive aller Argumente herauszufinden, kombinieren Sie -l mit -f:
$ pgrep -lf ssh 2816 /usr/sbin/sshd 3992 ssh -X huhn@asteroid 4249 ssh huhn@macnugget
Eine Abkürzung steht auch für das “Killerkommando” zur Verfügung: pkill versteht dieselben Optionen wie Pgrep und wird wie Kill zusammen mit dem Signal auf die Prozesse losgelassen:
pkill -19 ssh
Für Administratoren praktisch: Zusammen mit dem Parameter -u erreichen Sie gezielt die Prozesse eines anderen Benutzers (Listing 4). Root gibt dazu hinter der Option den Usernamen an.
# pgrep -lfu petrosilie 7682 sleep 4000000000 7792 bash […] # pkill -19 -u petrosilie
Glossar
-
Systembenutzer
-
Nur wenige Dienste auf einem Linux-System müssen mit den Rechten des Administrators laufen. Aus Sicherheitsgründen gibt es daher einige Prozesse, die nicht unter der Root-Kennung gestartet werden. Werfen Sie einen Blick in die Datei
/etc/passwd, sehen Sie dort neben den “echten” Benutzern auch Einträge fürlp,mailodernobody. Diese so genannten Systembenutzer sind dann verantwortlich für Dienste, wie zum Beispiel Druck-, Web- oder Mailserver.





