Quicklebendig und totgeglaubt
PIDs, Daemonen, Zombies und Jobs
Hollywoods Alpträume im System?
Wenn ich top aufrufe, um die Systemauslastung zu überprüfen, finde ich manchmal einen oder mehrere Zombies im System (Listing 3). Was bedeutet das?
Dr. Linux: Der Film "Dawn of the Dead", der hierzulande "Zombie" hieß, definiert diesen Begriff so: Wenn in der Hölle kein Platz mehr ist, dann kehren die Toten auf die Erde zurück.
Wem jetzt bereits vor seinem Linux-System gruselt, kann sich beruhigt zurücklehnen, obwohl auch in der Unix-Welt gestorben wird, und zwar von Prozessen, wenn sie sich beenden oder beendet werden. Ein Zombie ist ein toter Prozess, dessen Exit-Status vom Kernel weiterhin in der Prozesstabelle vorgehalten wird und darauf wartet, dass sein Elternprozess ihn liest. Erst dann kann er in Frieden aus der Prozesstabelle gelöscht werden. Stirbt der Elternprozess, bevor er diesen Zahlenwert gelesen hat, wird der Zombie ebenfalls gelöscht.
Listing 3
sieht einen Zombie
1:01am up 13:29, 1 users, load average: 0.25, 0.19, 0.1288 processes: 86 sleeping, 2 running, 1 zombie, 0 stoppedCPU states: 7.2% user, 8.0% system, 0.0% nice, 84.6% idleMem: 320072K av, 293952K used, 26120K free, 0K shrd, 16496K buffSwap: 305152K av, 3276K used, 301876K free 140224K cached
PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND
1719 perle 19 0 9224 8860 7164 R 8.0 2.7 0:25 kdeinit
1286 root 16 0 22264 13M 1720 S 5.7 4.3 9:40 X
4808 perle 14 0 1096 1096 792 R 1.3 0.3 0:09 top
1 root 9 0 208 208 176 S 0.0 0.0 0:04 init
[…]
1445 root 9 0 0 0 0 Z 0.0 0.0 0:00 cron <defunct>
[…]
Hintergrund oder Vordergrund?
Dass ich auf einer Kommandozeile Programme im Hintergrund starten kann, wenn ich ein & hinter den Aufruf setze, ist mir bekannt. Mit welchem Befehl hole ich mir aber einen von mehreren Hintergrund-Prozessen wieder in den Vordergrund zurück, so dass ich sie beispielsweise mit [Strg-C] beenden kann?
Dr. Linux: Programme, die auf einer Kommandozeile in den Hintergrund geschickt werden, um die Konsole nicht zu blockieren, bezeichnet man als Jobs. Beim Start eines Jobs erhält der Befehl zusätzlich zu seiner Prozessnummer eine Klammern gesetzte Ziffer, die so genannte Job-Nummer.
perle@maxi:~> emacs & [1] 1650
Die Hintergrundprozesse lassen sich für jede Konsole (und jedes X-Terminal) mit dem Befehl jobs auflisten:
perle@maxi:~> jobs [1] Running emacs & [2]- Running gimp & [3]+ Running xtetris &
Die aktiven Hintergrund-Programme sind mit Running gekennzeichnet, (englisch für "laufend"). Möglich ist auch Stopped für unterbrochene Programme, Terminated (deutsch: Beendet) oder Done. Ferner finden Sie Minus- und Pluszeichen vor. + kennzeichnet den zuletzt gestarteten Hintergrundprozess, - den vorhergehenden. Diese Zeichen können als Argumente mit vorangestelltem Prozentzeichen (%) an den Befehl fg übergeben werden, der einen Hintergrundprozess in der Vordergrund (englisch: "foreground") holt. Weitere mögliche Argumente wären
- %n, wobei n durch die Job-Nummer, also die in Klammern gesetzte Zahl, ersetzt werden muss.
- %e, das den Job, dessen Befehlszeile mit der Zeichenkette e anfängt, in den Vordergrund holt. Wenn mehr als ein Hintergrundbefehl auf die Zeichenkette passt, erhalten Sie eine Fehlermeldung:
bash: fg: ambigious job spec: e
Das bedeutet in etwa "Mehrdeutige oder verschwommene Job-Spezifikation: e".
- %?s, das den Hintergrundprozess hervorholt, dessen Befehlszeile die Zeichenkette s enthält (oder sich über eine mehrdeutige Job-Spezifikation beschwert).
- %% oder %+, die beide den aktuellen Job meinen.
- %-, das für den vorhergegangenen Job steht.
fg ist jedoch nicht der einzige Befehl, der bei der Job-Verwaltung in der bash hilft. Auch die folgenden Kommandos nehmen die eben beschriebenen Argumente entgegen:
- bg schickt einen Job in den Hintergrund. Damit bg in einer von einem Vordergrundprozess blockierten Shell überhaupt eingegeben werden kann, muss dieser mit [Strg-Z] vorübergehend gestoppt werden.
- kill beendet den als Argument angegebenen Job. Passt das Muster auf mehrere Prozesse, gibt es allerdings eine Fehlermeldung.
- Auch die Auflistung der Jobs mit jobs lässt sich mit den besprochenen Argumenten auf bestimmte Prozesse beschränken. Praktisch sieht das etwa so aus:
perle@maxi:~> jobs [1] Running emacs & [2]- Running gimp & [3]+ Running xtetris & perle@maxi:~> kill %1 perle@maxi:~> jobs [1] Beendet emacs [2]- Running gimp & [3]+ Running xtetris &
Bevor Sie Dateien-bearbeitende Programme wie den Emacs abschießen, sollten Sie jedoch einen Moment innehalten. Mit kill verlagern Sie Ihre ungesicherten Text-Dateien nämlich ebenfalls ins Nichts. Verlassen Sie die Konsole, aus der das Programm gestartet wurde, mit exit, bleibt Ihnen der Editor allerdings erhalten, und Sie können Ihre Daten ggf. noch sichern.
Liegen im mit exit zu beendenden Terminal noch unterbrochene Jobs in Warteposition, werden Sie freundlich daran erinnert:
There are stopped jobs.
Erst auf ein zweites exit hin verabschiedet sich die Konsole von Ihnen.
Glossar
umount
Das Einbinden von Datenträgern in den Linux-Dateibaum geschieht mit dem root vorbehaltenen mount-Befehl. Ehe man eine gemountete CD oder Diskette wieder aus dem Laufwerk entnehmen kann, ist ein umount-Befehl zwingend nötig. Auch Festplattenpartitionen lassen sich so dem Zugriff unter Linux wieder entziehen. In der Datei /etc/fstab kann der Systemverwalter jedoch auch festlegen, dass unprivilegierte Benutzer bestimmte Datenträger wie CD-ROMs ebenfalls ein- und aushängen dürfen.
Prozess
Der Betriebssystem-Kern (Kernel) hat direkten Zugriff auf die Ressourcen des Computers, zum Beispiel Speicher und Rechenzeit. Wird ein Kommando abgesetzt oder ein Programm aufgerufen, so lädt er den benötigten Programmcode in den Hauptspeicher. So gestartet bezeichnet man dieses Programm nun als Prozess (englisch: "task"). Jeder Prozess hat eine eindeutige Prozessnummer (PID), die das System in einer Prozesstabelle festhält. Prozesse haben keinen Zugriff auf die Ressourcen, sie fordern diese jeweils vom Kernel an. Wird das gleiche Programm, z. B. das Kommando gimp, zweimal gestartet, so handelt es sich (in der Regel) um zwei verschiedene Prozesse, obwohl das gleiche Programm ausgeführt wird. Der Betriebssystem-Kern verteilt die nötige Rechenzeit und den Speicher so blitzschnell, dass der Eindruck entsteht, Programme könnten gleichzeitig ablaufen. Prozesse können sich vermehren, indem sie durch Verdopplung Kinderprozesse (englisch: "child") entstehen lassen; dabei werden sie selber als Elternprozess (englisch: "parent") bezeichnet. Elternprozesse können darauf warten, dass ihre Kinderprozesse sich beenden oder sterben; umgekehrt geht dies nicht.
Daemonen
Eine Abkürzung für "Disk and Execution Monitor". Daemonen sind keine Bestandteile des Systemkerns, sondern Programme, die im Hintergrund laufen und ihre Leistungen anderen Programmen oder Rechnern zur Verfügung stellen. Einige werden beim Booten gestartet und bleiben während der gesamten Laufzeit eines Systems aktiv; andere sind nur solange aktiv, wie ihre Dienste benötigt werden.
Exit-Status
Ein (vom Programmierer) festgelegter Zahlenwert, der beschreibt, wie ein Programm aus dem Leben geschieden ist – erfolgreich, aufgrund eines Bugs etc.



