Kurzer Prozess für Zombies – ps, kill und Konsorten
Zu Befehl
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.
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 mitkill -9 PIDoder mit der langen Formkill -KILL PIDerreichen. - Interessant ist auch
kill -HUP PID(kill -1 PID), um Veränderungen in Konfigurationsdateien neu einzulesen. Beispielsweise zwingt einkill -HUPauf dieinetd-PID den Internet-Daemon, seine Konfigurationsdatei/etc/inetd.confneu 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.



