Zu Befehl: ps, pstree, lsof, kill

Aus LinuxUser 12/2003

Zu Befehl: ps, pstree, lsof, kill

Kurzer Prozess

Linux als multitasking-fähiges System besitzt eine leistungsfähige Prozessverwaltung – durch geschickte Ressourcenaufteilung scheinen Programme nicht nur gleichzeitig abzulaufen, es ist auch wesentlich leichter, sich von Prozessen zu trennen, die Probleme verursachen. Wir stellen Kommandos vor, mit denen Sie kurzen Prozess machen.

Zu Befehl

Auch wenn sich viele Dinge bequem über grafische Oberflächen wie KDE oder GNOME regeln lassen – wer sein Linux-System richtig ausreizen möchte, kommt um die Kommandozeile nicht herum. Abgesehen davon gibt es auch sonst viele Situationen, in denen es gut ist, sich im Befehlszeilendschungel ein wenig auszukennen.

Die Prozessverwaltung von Linux sorgt dafür, dass ein MP3-Player Musik macht, während Sie gleichzeitig mit einem Browser das Internet durchforsten. Die Prozesse laufen allerdings nicht wirklich zur selben Zeit, sondern bekommen nacheinander ein bisschen Rechenzeit zur Verfügung gestellt. Die Verteilung dieser Rechenzeit passiert so schnell, dass der Eindruck entsteht, Programme liefen tatsächlich gleichzeitig.

Ein Prozess wird aber nicht nur von Anwendungen gestartet – auch Systemdienste, die im Hintergrund laufen, bekommen auf diese Art Rechenzeit zugewiesen. Wir stellen Tools vor, mit denen Sie das Prozessgeschehen im Blick behalten.

Täterprofil

Prozesse sind nicht nur hierarchisch geordnet – es gibt, ähnlich wie bei Dateien, eine Rechtebeschränkung. Prozesse “gehören” zunächst einmal dem Anwender, der sie gestartet hat. Lediglich der Administrator root darf Prozesse anderer Anwender oder Systemdienste beenden. Wer was gestartet hat, verrät das Kommando ps. Hängen Sie den Parameter x an, werden alle eigenen, gerade laufenden Prozesse angezeigt:

huhn@asteroid:~$ ps x
  PID TTY      STAT   TIME COMMAND
  500 tty2     S      0:00 -bash
[…]
 1188 pts/1    SW     0:00 -bash
14534 ?        S      0:20 SCREEN
14535 pts/8    S      0:00 /bin/bash
16397 pts/8    S      0:24 vim lsof_ps_kill.html
16403 ?        S      0:03 xterm
24551 pts/16   R      0:00 ps x

PID steht für Process Identifier. Diese Nummer ist eindeutig vergeben und wird beispielsweise benötigt, um Prozesse gezielt zu beenden. TTY zeigt die Nummer des Terminals oder der virtuellen Konsole an, wo der Prozess gestartet wurde. Die erste Konsole heißt z. B. /dev/tty1, ein xterm kann (wie im Listing zu sehen) /dev/pts/8 sein. Manche Prozesse, die vom System gestartet werden, sind keiner Konsole zugeordnet und haben daher ein ? im TTY-Feld.

Im Feld STAT dürfen mehrere Buchstaben stehen: S steht für “sleeping” (schlafend), R für “running” (läuft gerade), und SW heißt, dass der Prozess nicht nur schläft, sondern auch noch in den Swap-Speicher ausgelagert wurde. Dies passiert beispielsweise dann, wenn der Arbeitsspeicher für die aktiven Prozesse nicht ausreicht – Programme, die gerade nicht laufen, können in den Swap ausgelagert werden, um Platz für andere zu machen. Manchmal steht als Status-Flag ein Z in der Liste. Es bedeutet “Zombie” und meint einen Prozess, der zwar beendet ist, seinen Rückgabestatus aber nicht richtig übergeben konnte.

TIME verrät die verbrauchte Rechenzeit, und unter COMMAND finden Sie den Programmnamen. Wer die Ausgabe etwas ausführlicher haben möchte, verwendet weitere ps-Optionen: u sorgt für zusätzliche Informationen, z. B. Prozessrigentümer oder Rechenzeit-/Speicheranteil, und a fügt der Liste auch Prozesse anderer Anwender hinzu (Listing 1).

Listing 1

Ausgabe von “ps aux”

huhn@asteroid:~$ ps aux
USER       PID %CPU %MEM   VSZ  RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1  1272   72 ?        S    Jul10   0:12 init [2]
[…]
www-data   604  0.0  0.0  2924    8 ?        S    Sep29   0:00 /usr/sbin/apache
[…]
huhn      1173  0.0  0.2  2272  128 ?        S    Jul10   0:08 /usr/bin/ssh-agen
huhn      1177  0.0  1.5  3132 1000 ?        S    Jul10   5:12 fvwm2

Das Kommando ps hat unzählige weitere Optionen, die bei der Ausgabe am Bildschirm helfen. Wer sich vor allen Dingen für die “Speicherfresser” interessiert, kann natürlich die Prozessliste sortieren (Option --sort), einfacher geht das allerdings mit top. Dieses Tool verrät Ihnen nicht nur, welcher Prozess gerade am meisten Arbeit verursacht, sondern aktualisiert die Ausgabe ständig und bleibt so auf dem neuesten Stand (Abbildung 1).

Abbildung 1: Übersichtlich – top ist top!

Abbildung 1: Übersichtlich – top ist top!

Den Wald vor lauter Bäumen nicht?

Jeder Prozess kann weitere Prozesse starten und wird dadurch zu einem “Elternprozess” (englisch: “parent process”). Der allererste Prozess ist dabei immer init; davon ausgehend starten “Kindprozesse” (englisch: “child process”), die wiederum weitere Prozesse hervorbringen können. Wenn ein “Kind” beendet wird, übergibt es seinen Status an den “Vater”. Ist dieser zwischenzeitlich selbst beendet worden, geht die umgekehrte Erbfolge bis zurück zu init.

Die familiären Beziehungen zwischen den Prozessen verrät das ps-Kommando mit angehängter Option l (“display long format”). Im Feld PPID wird die Parent Process ID ausgegeben – logisch, dass init hier eine 0 stehen hat. Übersichtlicher ist die Ausgabe des Kommandos pstree. Der Name ist Programm: In einer Baumansicht sehen Sie, welche Prozesse voneinander abhängen (Abbildung 2).

Abbildung 2: Baum oder Wald – pstree

Abbildung 2: Baum oder Wald – pstree

Nichts geht mehr

Wenn Prozesse nicht ordentlich beendet werden, kann es schon mal vorkommen, dass eine Anwendung ein Gerät weiterhin belegt, obwohl sie dieses hätte freigeben müssen. An dieser Stelle hilft das Programm lsof (“list open files”, zu deutsch: “liste offene Dateien auf”) weiter. Bei den meisten Distributionen liegt es unter /usr/sbin/ – starten Sie es mit voller Pfadangabe /usr/sbin/lsof, wenn Ihr Pfad das Verzeichnis nicht enthält. Ohne Angabe weiterer Parameter präsentiert lsof alle offenen Dateien des Systems. Wer sich für diese lange Liste interessiert, leitet die Ausgabe am besten an einen Pager wie more oder less weiter:

huhn@asteroid:~$ /usr/sbin/lsof | less

Gezielter arbeiten Sie mit lsof, wenn Sie den Namen der entsprechenden (Geräte-) Datei angeben. Blockiert beispielsweise ein Prozess das CD-ROM-Laufwerk (“umount: /cdrom: Das Gerät wird momentan noch benutzt”), hilft lsof, den Schuldigen zu finden:

huhn@asteroid:~$ /usr/sbin/lsof | grep cdrom
gzip      17614 huhn    3r   REG       22,0   35424      58350 /cdrom/INDEX.gz

Dabei wird die Ausgabe des Kommandos lsof an das Programm grep weitergeleitet, welches nach Vorkommen von cdrom sucht. Alternativ können Sie hier auch /usr/sbin/lsof /dev/cdrom verwenden, falls an dieser Stelle das Laufwerk eingehängt ist.

Das Listing zeigt: Offenbar greift hier der Prozess mit der Nummer 17614 auf die Datei /cdrom/INDEX.gz zu. Um dem Schuldigen ausfindig zu machen, kann jetzt wieder das ps-Kommando eingesetzt werden (Listing 2).

Listing 2

Teamarbeit von lsof und ps

huhn@asteroid:~$ /usr/sbin/lsof | grep cdrom
gzip      17614 huhn    3r   REG       22,0   35424      58350 /cdrom/INDEX.gz
huhn@asteroid:~$ ps aux | grep 17614
huhn     17614  0.0  0.6  1608  432 pts/16   S    14:20   0:00 gzip -cdfq /cdrom/INDEX.gz
huhn     25150  0.0  0.6  1336  436 pts/15   S    14:21   0:00 grep 17614

Killer-Kommando

Wer sich mit Gewalt von einem Prozess trennen möchte, kann das Kommando kill zu Hilfe nehmen. Dieses “schießt” Prozesse aber nicht einfach nur ab, es kann stattdessen alle möglichen Signale an Prozesse schicken. Mit kill -l (“l” steht für Liste) erhalten Sie eine Übersicht (Abbildung 3).

Abbildung 3: Signale, die Sie mit "kill" an die Prozesse schicken können

Abbildung 3: Signale, die Sie mit “kill” an die Prozesse schicken können

Nicht all diese Signale sind wichtig und kommen häufig zum Einsatz, es lohnt sich aber, ein paar elementare Funktionen auswendig zu lernen. Wer einen Prozess nicht richtig beenden, sondern einfach nur kurz stoppen möchte, verwendet kill -STOP PID. In der Liste ist dieses Signal unter Punkt 19 SIGSTOP zu finden, es geht daher auch mit der numerischen Signalangabe kill -19 PID. Um den Prozess wiederzubeleben, verwenden Sie das Signal 18, SIGCONT (wie englisch “continue”, fortfahren): kill -CONT PID oder kill -18 PID.

Außerdem wichtig sind SIGTERM (15) und SIGKILL (9). Ersteres – auf einen Prozess losgelassen – versucht, diesen noch “ordentlich” zu beenden; kill -9 hingegen “schießt” den Prozess bedingungslos ab und ist nur in Ausnahmefällen zu empfehlen, weil der Prozess hier keine Möglichkeit erhält, etwaige offene Dateien noch zu schließen: Beim Abschuss mit kill -9 droht also Datenverlust.

Neben kill steht Ihnen auch killall zur Verfügung: Dieses Tool benötigt keine Prozess-ID, sondern nimmt den Namen einer Anwendung und schickt Signale an alle Instanzen. Vorsicht ist also geboten: Ein killall bash beendet sämtliche Bash-Shells auf dem Rechner – einschließlich derjenigen, in der Sie das Kommando eingegeben haben.

LinuxUser 12/2003 KAUFEN
EINZELNE AUSGABE
ABONNEMENTS
TABLET & SMARTPHONE APPS
E-Mail Benachrichtigung
Benachrichtige mich zu:

Hinweis: Dieser Artikel ist älter als ein Jahr, enthaltene Informationen sind möglicherweise veraltet.

0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben