Zu Befehl

Aus LinuxUser 12/2000

Zu Befehl

Kurzer Prozess für Zombies – ps, kill und Konsorten

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, wo es gut ist, sich im Befehlszeilendschungel ein wenig auszukennen.

Linux ist multitaskingfähig, d. h. dass mehrere Programme oder Prozesse auf einem Prozessor im Prinzip gleichzeitig ausgeführt werden können. Die Prozesse werden allerdings nicht wirklich zur selben Zeit bearbeitet, sondern sie bekommen nacheinander ein bisschen Rechenzeit zur Verfügung gestellt – Rechenzeit heißt in dem Fall natürlich nur Bruchteile von Sekunden. Es entsteht also der Eindruck, daß alle Programme gleichzeitig laufen. In dieser Folge geht es um die Verwaltung von Prozessen und um die Tools, die Sie dabei unterstützen.

Dem System den Prozess machen

Welche Prozesse gerade auf Ihrem Linux-System laufen, können Sie schnell mit dem Kommando ps feststellen. Tippen Sie ps x, werden alle gerade laufenden Prozesse angezeigt:

huhn@asteroid:~$ ps x
  PID TTY      STAT   TIME COMMAND
  353 ?        SW     0:00 [.xsession]
  380 ?        S      0:00 /usr/bin/ssh-agent /home/huhn/.xsession
...
  391 pts/1    SW     0:00 [bash]
  392 pts/0    S      0:00 -bash
...
16798 pts/5    S      0:00 ./zombie
16799 pts/5    Z      0:00 [zombie <defunct>]
...
16802 pts/0    R      0:00 ps x

Hier sehen Sie verschiedene Informationen auf einen Blick: die PID (Process Identification), das Terminal, in dem der Prozess gestartet wurde, und den aktuellen Status/Zustand des Programms. Die Buchstaben unter STAT lassen sich schnell aufschlüsseln: S wie “sleeping”, R wie “running”, SW bedeutet, dass der Prozess nicht nur “schläft”, sondern auch noch in den Swap-Speicher ausgelagert wurde. Das erkennt man auch an den eckigen Klammern ([ ]).

Ein gerade laufender Prozess muss im Arbeitsspeicher liegen. Wenn dieser für die aktiven Prozesse nicht ausreicht, können Programme, die gerade nicht laufen, in den Swap ausgelagert werden, um Platz für andere zu schaffen. Da bieten sich zuerst die Prozesse an, die sowieso “schlafen” und nichts zu tun haben.

In der Liste sehen Sie ein weiteres Status-Flag: Z. Dieses steht für “Zombie”. Ein solcher Prozess ist abgelaufen, konnte aber seinen Rückgabestatus seinem Vater-Prozess noch nicht übergeben.

Neben S, R, SW und Z gibt es noch weitere Buchstaben, die den aktuellen Status beschreiben. Steht dort beispielsweise ein D, handelt es sich um einen Prozess, der nicht mehr wieder “aufzuwecken” ist. So etwas kann passieren, wenn in eine Datei geschrieben werden soll, die auf einem per NFS gemounteten System liegt, das in der Zwischenzeit abgestürzt ist.

Eigene Prozesse kann man selbst anhalten und wieder starten. Natürlich kann man als einfacher User keine Systemprozesse stoppen. Möchte man ein Programm also anhalten, geht das mit kill -STOP PID (kill -19 PID). Soll der Prozess weiterlaufen, kann man ihn mit kill -CONT PID (“continue”) (kill -18 PID) dazu überreden. Beispiel aus der Praxis: Will man als root den gpm (“general purpose mouse” – Mausunterstützung auf der Konsole) anhalten, sollte man zuerst nach der Prozessnummer suchen (z. B. mit ps x | grep gpm), dann kill -STOP PID aufrufen. Dieser Prozess erhält nun ein T als Status-Flag, was für “traced” (eigentlich von: to trace, schrittweise verfolgen; hier: angehalten) steht.

Auch im Hintergrund – die Shell als Prozessverwalter

Die Shell nimmt an der Kommandozeile Eingaben entgegen und entscheidet, ob es interne Kommandos oder externe Programme sind. Externe Programme werden als neue Prozesse gestartet. Sofern diese auf Tastatureingaben und Bildschirmausgaben angewiesen sind, ersetzen sie die Shell vorübergehend im Terminal. Startet man beispielsweise das Programm ncftp, ist dieses im Vordergrund und nimmt die getippten Befehle entgegen. Erst, wenn das Programm beendet wird, kommt die Shell wieder zum Einsatz.

Es gibt natürlich auch Programme, die nicht auf Benutzereingaben angewiesen sind. Wenn man weiter in der Shell arbeiten möchte, kann man das Programm mit programm & sofort in den Hintergrund stellen. Läuft das Programm bereits, bewirken die Tastenkombination [Strg+Z] und das anschließende Kommando bg (kurz für “background”, Hintergrund) das gleiche. Mit fg (kurz für “foreground”) läuft es wieder im Vordergrund. Hier gibt es noch einen Trick: Man kann auch mehrere Programme in den Hintergrund stellen. Tippt man danach jobs, erhält man Informationen, was da alles hinter den Shell-Kulissen abläuft:

huhn@asteroid:~$ jobs
[1]-  Running     xkoules &
[2]+  Running     xskat &

Hier sieht man direkt als erste Information die interne Job-ID (die von jeder Shell separat vergeben wird). Damit kann man die Jobs verwalten, z. B. einzeln in den Vorder- oder Hintergrund schieben. Mit dem Aufruf fg 1 holt man xkoules z. B. wieder nach vorne. Dieses Feature ist noch aus Zeiten übrig geblieben, als man an einem einzigen Terminal arbeitete. Wenn es zwei interaktive Programme gab, war das natürlich viel leichter zu handhaben – man konnte z. B. einen Texteditor in den Hintergrund stellen, während man das editierte Programm kompilierte, anstatt ihn zu beenden.

Kein Wald, aber ein Baum

Das Kommando ps hat natürlich jede Menge Optionen, mit denen man verschiedene Auswahlmöglichkeiten oder Eigenschaften steuern kann. Beispielsweise zeigt ps au auch die Prozesse anderer Benutzer, die an irgendein Terminal gebunden sind. Das u sorgt dabei dafür, daß weitere Informationen angezeigt werden, u. a. auch die Namen der Prozess-Eigentümer:

USER       PID %CPU %MEM   VSZ  RSS TTY      STAT START   TIME COMMAND
root       307  0.0  1.0  1996  672 tty1     S    16:58   0:00 -bash
...
huhn      1427  0.0  1.5  2272 1000 pts/3    S    17:04   0:07 vim befehl11.html
...
easter   16914  8.3  1.5  2628  988 pts/5    R    23:44   0:00 ps au

Hier lässt sich darüber hinaus noch erkennen, wie hoch der aktuelle Rechenzeitanteil (unter %CPU) ist, der Anteil am Speicher (%MEM) oder die Uhrzeit (START) des Programmstarts; bei älteren Prozessen wird statt der Uhrzeit das Start-Datum angezeigt. Mit ps r bekommt man nur die laufenden Prozesse angezeigt, mit ps U username die eines bestimmten Users. Nützlich ist auch die Option ps l (mit “l” wie Liste). Hier erfährt man auch etwas über die PPID (“parent process ID”) – einen schöneren Überblick, welcher Prozess von wem abstammt, liefert allerdings das Kommando pstree in einer Baumansicht:

huhn@asteroid:~$ pstree
init-+-atd
     |-bash
     |-cron
     |-kdm-+-XF86_SVGA
     |     `-kdm---.xsession-+-fvwm2
     |                       |-ssh-agent
     |                       |-xclock
     |                       |-xeyes
...

Eine solche Übersicht gibt es auch bei ktop von KDE (s. Abb. 1), wenn Sie die Option show tree angeklickt haben.

Abbildung 1: KDE's ktop bietet eine schöne Darstellung der Baumstruktur

Abbildung 1: KDE’s ktop bietet eine schöne Darstellung der Baumstruktur

ps bietet so viele Parameter, dass sie hier nicht alle aufgeführt werden können. Werfen Sie einen Blick in die Man-Page und “stricken” Sie Ihr eigenes Ausgabeformat. Das Programm top gibt eine sinnvolle Auswahl periodisch wieder. Auch für GNOME gibt es top mit einer grafischen Oberfläche (s. Abb. 2) mit der praktischen Zusatzfunktion Filesystems (free).

Hat man einmal die Kontrolle über einen Prozess verloren, kann man diesen auch mit Gewalt beenden. Hier kommt das Kommando kill ins Spiel. Dieses kann – wie schon erwähnt – alle möglichen Signale an Prozesse versenden. Es gibt verschiedene Signale, um einen Prozess zu beenden, die sich dadurch unterscheiden, ob sie vom Prozess ignoriert oder abgefangen und verarbeitet werden können. Mit kill -l (mit “l” wie Liste) bekommen Sie eine Übersicht über alle möglichen Signale, darunter auch die vom System intern verwendeten (z. B. SIGSEGV für die allseits beliebten Speicherüberschreiber):

huhn@asteroid:~$ kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL
 5) SIGTRAP      6) SIGABRT      7) SIGBUS       8) SIGFPE
 9) SIGKILL     10) SIGUSR1     11) SIGSEGV     12) SIGUSR2
13) SIGPIPE     14) SIGALRM     15) SIGTERM     17) SIGCHLD
18) SIGCONT     19) SIGSTOP     20) SIGTSTP     21) SIGTTIN
22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO
30) SIGPWR      31) SIGSYS

SIGSTOP und SIGCONT haben Sie schon kennengelernt – zwei weitere sind in der Praxis interessant.

  • Mit SIGTERM (15) können Sie ein Programm darum “bitten”, sich zu beenden (es kann das Signal intern noch verarbeiten).
  • Mit SIGKILL (9) hingegen wird das Programm bedingungslos “abgeschossen”. Dieses kann man entweder mit kill -9 PID oder mit der langen Form kill -KILL PID erreichen.
  • Interessant ist auch kill -HUP PID (kill -1 PID), um Veränderungen in Konfigurationsdateien neu einzulesen. Beispielsweise zwingt ein kill -HUP auf die inetd-PID den Internet-Daemon, seine Konfigurationsdatei /etc/inetd.conf neu einzulesen.

killall kriegt sie alle…

In der Regel kennen Sie die ID eines Prozesses, den Sie abschießen wollen, nicht: Sie sehen etwa ein eingefrorenes Netscape-Fenster und möchten dies am liebsten mit kill -9 pid schließen. Nur mit den Tools ps und kill ausgerüstet, müssten Sie nun zunächst mit

ps aux | grep netscape

nach der Prozess-ID von Netscape suchen und diese dann in den kill-Aufruf übernehmen – es geht aber einfacher: ein

killall -9 netscape

leistet genau dies (immer vorausgesetzt, dass das laufende Programm auch netscape und nicht z. B. netscape-communicator heißt). Aber Vorsicht: Es werden wirklich alle passenden Prozesse beendet; so schießt etwa killall bash sämtliche Bash-Shells auf dem Rechner ab – einschließlich derjenigen, in der Sie das killall-Kommando eingegeben haben.

Netter Versuch – nice try!

Schauen Sie sich nochmal die Ausgabe von top an: Hier steht an einer Stelle NI – aufgeschlüsselt steht das für “nice”. Mit dem gleichnamigen Befehl kann man Prozessen eine Ausführungs-Priorität zuweisen: Normale Benutzer können die Priorität lediglich herabsetzen, nur root darf sie auch heraufsetzen. Ein Programm, das mit niedrigerer Priorität läuft, erhält nur dann Rechenzeit, wenn sie von keinem Prozess mit höherer Priorität benötigt wird. Standardmäßig werden Programme mit dem nice-Wert 0 gestartet, ein Wert von -20 bedeutet höchste Priorität, +19 ist die niedrigste. Wird kein Wert angegeben, startet nice Programme mit dem Wert 10.

Starten Sie top z. B. mit nice top, sehen Sie für diesen Prozess:

PID USER     PRI  NI  SIZE  RSS SHARE STAT  LIB %CPU %MEM   TIME COMMAND
17827 huhn      19  10  1168 1168   704 R N     0  2.1  1.8   0:01 top

Soll top auf niedrigster Priorität laufen, nimmt man nice -19 top (für die höchste Stufe nice --20 top). Wenn Ihnen das doppelte Minus nicht gefällt, können Sie auch die Option “-n” verwenden und z. B. nice -n 19 ... oder nice -n -20 ... schreiben.

Abbildung 2: gtop ist GNOME's Frontend zur Prozess-Überwachung

Abbildung 2: gtop ist GNOME’s Frontend zur Prozess-Überwachung

Die vorgestellten Tools haben natürlich noch mehr Optionen; insbesondere ps kann damit leicht verwirren, zumal unterschiedliche ps-Versionen im Umlauf sind, der Optionen sich unterscheiden. Sollte etwas nicht wie erwartet funktionieren, empfiehlt sich also – wie üblich – der Blick in die Manual-Seiten.

Glossar

Swap-Speicher

Um den insgesamt verfügbaren Speicher zu vergrößern, kann man den physikalischen Arbeitsspeicher (RAM) mit speziellen Bereichen auf der Festplatte ergänzen, z. B. Swap-Partition oder Swap-Dateien. Diese werden als root mit dem Kommando mkswap angelegt (siehe auch die man-Page zu diesem Befehl).

Vater-Prozess

Jeder Prozess, mit Ausnahme des allerersten (init), wurde von einem anderen gestartet. Dieser “andere” ist der Vater-Prozess (engl. “parent process”), der neu gestartete das “Kind” (engl. “child”). Wenn das “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.

LinuxUser 12/2000 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