8.7 Jobverwaltung
Mit dem Job-Control-System können Sie Prozesse, die im Hintergrund laufen, in den Vordergrund holen. Dadurch können Sie Prozesse, die eventuell im Hintergrund »Amok« laufen (und die kompletten Ressourcen aufbrauchen) oder etwa auf eine Eingabe von stdin warten, hervorholen und unterbrechen oder gegebenenfalls wieder in den Hintergrund schicken und weiterlaufen lassen. Sie kennen das ja mittlerweile zuhauf: Wenn Sie einen Hintergrundprozess gestartet haben, wird die PID und eine Nummer in eckigen Klammern angezeigt. Bei dieser Nummer handelte es sich stets um die Jobnummer.
you@host > sleep 10 &
[1] 5915
you@host > sleep 5 &
[2] 5916
Hier wurden mit sleep also zwei Prozesse in den Hintergrund geschickt. Der Prozess mit der Nummer 5915 hat hier die Jobnummer 1 und 5916 die Nummer 2. Um sich jetzt einen Überblick zu allen sich im Hintergrund befindlichen Prozessen zu verschaffen, können Sie das Kommando jobs verwenden:
you@host > jobs
[1]- Running sleep 10 &
[2]+ Running sleep 5 &
Das Kommando jobs zeigt Ihnen neben den Prozessen, die im Hintergrund laufen, auch den aktuellen Zustand an (hier mit Running). Ein Beispiel:
you@host > du /
...
...
(Strg)+(Z)
[1]+ Stopped du /
Der Prozess hat Ihnen einfach zu lange gedauert und Sie haben diesem zwangsläufig mit (Strg)+(Z) das Signal SIGSTOP geschickt, womit der Prozess kurzum angehalten wurde. Jetzt haben Sie einen gestoppten Prozess in Ihrer Prozessliste:
you@host > ps -l | grep du
+0 T 1000 6235 3237 0 78 0 – 769 pts/40 00:00:00 du
Anhand des T (für Traced) können Sie den Prozess erkennen. Auch ein Blick mit jobs zeigt Ihnen den Zustand des gestoppten Prozesses an:
you@host > jobs
[1]+ Stopped du /
Hinweis Natürlich hat man gerade bei einem Hintergrundprozess keine Möglichkeit mehr, mit der Tastatur das Signal SIGSTOP (mit (Strg)+(Z)) an den laufenden Hintergrundprozess zu schicken, weil hier ja die Standardeingabe nach /dev/null umgelenkt wird. Hierbei können Sie von der Kommandozeile das Signal mittels kill an den entsprechenden Prozess schicken, sofern Sie diesen nicht gleich ganz beenden wollen.
|
Da Sie jetzt einen angehaltenen Prozess haben, können Sie unterschiedlich darauf reagieren:
|
Sie senden dem angehaltenen Prozess das Signal SIGCONT, mit dem dieser seine Ausführung fortsetzt. Allerdings müssen Sie hier nicht zwangsläufig die Prozess-ID mit angeben, sondern können auch das Prozentzeichen % gefolgt von der Jobnummer verwenden: |
you@host > kill -SIGCONT %1
|
Damit wird der Job mit der Nummer »1« wieder fortgesetzt (SIGCONT = continue). |
|
|
|
Sie beenden den angehaltenen Prozess. Hier gehen Sie ebenso vor wie schon mit SIGCONT gezeigt, nur dass Sie eben das Signal SIGTERM oder, falls das nicht mehr geht, SIGKILL schicken: |
you@host > kill %1
[1]+ Beendet du /
|
Sie schieben einen angehaltenen Job mit bg (background) in den Hintergrund, wo dieser dann munter weiterläuft. Auch hierzu müssen Sie das Prozentzeichen und die entsprechende Jobnummer verwenden: |
you@host > bg %1
|
Geben Sie bg ohne Prozentzeichen an, wird der einzige Job, der möglich ist, in den Hintergrund geschickt. Verwenden Sie das Prozentzeichen ohne Jobnummer, bezieht sich die Angabe immer auf den aktuellen Job (current job). |
|
|
|
Sie lassen den Job mit fg (foreground) im Vordergrund weiterlaufen. Dies würde in etwa dem Fall von SIGCONT entsprechen, nur wäre es eben etwas komfortabler (kürzer). fg verwendet man genauso wie bg. Der Angabe des Prozentzeichens folgt die Jobnummer oder auch abgekürzt nur das Prozentzeichen, was den aktuellen Job (current job) im Vordergrund weiterlaufen lässt. |
Tabelle 8.1 gibt nochmals einen Überblick zu den Funktionen der Jobverwaltung:
Tabelle 8.1
Kommandos zur Jobverwaltung
Job-Befehl
|
Bedeutung
|
fg %jobnr
|
Holt sich einen Job in den Vordergrund, wo dieser weiterläuft
|
bg %jobnr
|
Schiebt einen angehaltenen Job in den Hintergrund, wo dieser weiterläuft
|
(Ctrl)+(Z)
|
Hält einen sich im Vordergrund aufhaltenden Prozess auf (suspendiert diesen)
|
kill %jobnr
|
Beendet einen Prozess
|
kill –SIGCONT %jobnr
|
Setzt die Ausführung eines angehaltenen Prozesses fort (egal, ob im Hinter- oder Vordergrund)
|
Das folgende Script soll Ihnen den Sinn von fg näher demonstrieren.
# Name: ascript
echo "Das Script wird gestartet ..."
printf "Warte auf Eingabe: "
read input
echo "Script ist fertig ..."
Das Script bei einer Ausführung im Hintergrund:
you@host > ./ascript &
[1] 7338
[1]+ Stopped ./script1
you@host > fg %
./script1
Das Script wird gestartet ...
Warte auf Eingabe: Hallo
Script ist fertig ...
you@host >
Hier hat das Script von selbst angehalten, weil sich darin eine Eingabeaufforderung mittels read befand. Deshalb wurde das Script mittels fg in den Vordergrund geholt, um dieser Aufforderung nachzukommen. Anschließend wurde das Script weiter abgearbeitet.
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.
|