Job Control


Mehre kurze Kommandos, die alle irgendwie zusammenhängen.


Wenn du:

ps ax

(ps steht für "process status")
machst, siehst du alle Programme, die momentan gerade auf deinem Compi laufen. D.h. manche davon laufen nicht, die schlafen (die haben ein S für sleeping). Man nennt diese laufenden (und schlafenden) Programme: "prozesse" oder manchmal auch "jobs"). Jeder dieser Jobs hat eine Nummer, die ihn identifiziert (die steht in der ps-Ausgabe an erster Stelle)

Ein andere Befehl, um sich die aktuell laufenden Prozesse anzusehen ist:

top

top deshalb, weil er die Prozesse geordnet nach CPU-Zeitverbrauch ordnet. (Man kann auch nach Speicherverbrauch ordnen, wenn man in top groß M drückt)

Die Anzeige wird solange periodisch upgedated, bis man
q

drückt, um das Programm zu beenden.

Die erste Spalte ist wieder die Nummer des Prozesses (auch PID genannt). Die ganz oberste Zeile zeigt dir dieselbe Ausgabe wie der Befehl

uptime

an, die 3 Werte hinter "load average" ist die gemittelte Anzahl an Prozessen die gleichzeitig laufen wollen. Und zwar über 1 bzw 5 bzw 15 Minuten gemittelt. Ein "load average" von 1 heisst also, dass im Durchschnitt ständig 1 Prozess laufen will. D.h. dein Compi ist zu 100% ausgelastet. Wenn du einen "load average" von z.B. 3 hast, dann sind 3 Prozesse, die alle gleichzeitig laufen wollen. Dein Compi ist auch zu 100% ausgelastet, aber jeder der Prozesse bekommt nur ein Drittel der Zeit, die er gerne haben würde. Üblicherweise sollte der "load average" unter 1 sein..

Wenn dein Compi also aus irgendeinem Grunde seltsam langsam zu reagieren scheint, lohnt sich meist ein Aufruf von top, um zu sehen, wer denn da soviel CPU-Zeit verbraucht. (meist ein hängengebliebenes Netscape)

Um das Programm zu beenden, kannst du den "kill" Befehl benutzen:

kill 1234

würde den Prozess mit der Nummer 1234 killen, in dem ihm mitgeteilt wird, dass er sich gefälligst beenden soll. Wenn sich der Prozess aber wirklich aufgehängt hat, ignoriert er das kill eventuell. Dann kann man noch den "Holzhammer" verwenden:

kill -9 1234

sollte dann funktionieren.

Wenn du zum "Üben" fürs "killen" ein Programm haben willst, das lange rechnet und viel CPU braucht kannst du ja z.b:

echo 123456^123456 | bc &

eintippen. Das würde dem Programm "bc" sagen, es soll 123456123456 ausrechnen. Die Zahl, die da rauskommt, hat ja doch einige hunderdtausend Stellen.

Notfalls kannst du auch alle bc killen mit:

killall bc

so. Mehr über Job Control ein ander mal..

Wollen wir nur ein Programm, das lange braucht, aber keine CPU-Zeit verbrät, dann koennen wir auch

sleep 1000 &

verwenden. Das macht nichts anderes, als 1000 Sekunden zu "schlafen".

Auch die bash bietet uns einige Möglichkeiten, um mit Jobs umzugehen.

Das & am Ende einer Zeile sagt der Shell, dass dieser Prozess im Hintergrund laufen soll, um nicht unsere aktuelle Shell zu blockieren. (Ansonsten müsstest du 1000 Sekunden warten, bis du wieder einen Shell- Prompt (Eingabeaufforderung) bekommst)

Bemerkt man erst mit der Zeit, dass man einen Prozess gerne im Hintergrund haben würde dann kann man das mit Control-Z machen. Das "stoppt" den Prozess. Er lauft nicht, aber er kann wieder reaktiviert werden. Und zwar mit dem shell Befehl:

bg

(für Background). Das reaktiviert den letzten gestoppten Befehl und schickt ihn in den Hintergrund. Er läuft dann so, als wäre er mit & am Ende gestartet worden.

Alternativ kann man

fg

(foreground) verwenden, um den gestoppten Prozess im Vordergrund weiterzuführen.. (Nur wenn der Prozess im Vordergrund läuft, kann man auch Eingaben dorthin machen).

der bash Befehl

jobs

zeigt alle gerade von dieser Shell aus kontrollierten Jobs an. Die Nummer in Klammer kann man beim kill verwenden um den prozess anzusprechen (anstatt seiner echten Prozessnummer.)

also z.b:

sleep 100 &

kill %1

würde genau diesen Befehl killen.

Befehle, die man gerne in den Hintergrund schickt, sind welche die ohnehin keine Ausgabe auf dem Terminal machen, sondern die grafische X11 Oberfläche verwenden. z.b.:

xterm &

oder:

netscape &


EXERCISES:

Starte ein:

sleep 1000

Benutze ^z und fg und bg um diesen Befehl in den Vordergrund und in den Hintergrund zu schicken. Schau dir die Ausgabe von "jobs" an.

Schau dir die Ausgabe von ps und top an.

Versuche einen von dir gestarteten sleep Befehl auf verschiedenste Arten zu killen.


REFERENCES:

man ps
ps --help
man top
man kill
help kill
kill --help
help fg
help bg
help jobs