Alle Shells bieten die Möglichkeit Prozesse zu steuern. Dieses bedeutet, dass die Ausführung von Befehlen bzw. Prozessen beeinflusst werden kann. Sie können so im Hintergrund laufen, in den Vordergrund geholt werden, in den Hintergrund verlagert werden, angehalten oder abgebrochen werden. Es können ohne weiteres auch mehrere Prozesse im Hintergrund laufen (also eine Art Multitasking). Bei allen Befehlen handelt es sich um eingebaute Befehle der Shell, nicht um Programme (Ausnahme ist hier nohup).
Mit dem Befehl jobs werden alle aktuellen Jobs anzeigt. Die allgemeine Syntax lautet:
jobs <Optionen>
jobs kennt die folgenden Optionen:
| jobs - Optionen | |
| Option | Beschreibung |
-l | Zeigt zusätzlich die PID (Prozessidentifikationsnummer) der Prozesse an. |
-p | Zeigt nur die PID(s) an. |
-n | Zeigt nur die seit dem letzten Aufruf von jobs veränderten Angaben an. |
-r | Zeigt nur aktuell laufende Prozesse an. |
-s | Zeigt nur die momentan angehaltenen Prozesse an. |
Eine Ausgabe von jobs kann z.B. so aussehen:
user@laptop:~$ jobs [1]+ Stopped wget -nv http://download.server.org/linux_image_1.iso [2]- Running wget -nv http://download.server.org/linux_image_2.iso &
Es wird also die Jobnummer, der aktuelle Jobstatus sowie der komplette Befehl ausgegeben.
Um einen Befehl oder Prozess im Hintergrund laufen zu lassen, wird einfach ein Kaufmanns-Und & mit Leerstelle an den Befehl angehängt. Die allgemeine Syntax lautet:
Befehl &
Beispiel:
user@laptop:~$ wget -nv http://download.server.org/linux_image_1.iso & [1] 5434 user@laptop:~$
So wird der Shell signalisiert, dass der Befehl als Hintergrund-Prozess ausgeführt werden soll. Daraufhin erhält man eine Ausgabe, die die Jobnummer (hier also 1) und die Prozessindentifikationsnummer PID (hier also 5434) ausgibt.
Auch wenn ein Prozess im Hintergrund läuft, kann dieser auf die Standardausgabe schreiben. Daher ist die Ausführung im Hintergrund primär sinnvoll, wenn der Befehl bzw. Prozess längere Zeit für die Ausführung braucht (z.B. dd zum Kopieren bzw. Klonen von Partition), aber währenddessen nichts (oder wenig) auf die Standardausgabe schreibt. Schreibt ein Prozess während der Ausführung viel auf die Standardausgabe, so hat eine Ausführung im Hintergrund keinen Sinn (zumindest nicht mit &), da Eingaben immer wieder durch Ausgaben unterbrochen werden. Deshalb wird hier in allen Beispielen auch des Befehl wget mit der Option -nv (=non-verbose, also "nicht mitteilsam") benutzt, da ansonsten wget zu viel auf die Standardausgabe schreiben würde. Alternativ kann man die Ausgabe gegebenenfalls auch in eine Datei umleiten.
Mit der Tastenkombination Strg + Z können im Vordergrund laufende Prozesse angehalten werden. Beispiel:
user@laptop:~$ wget -nv http://download.server.org/linux_image_1.iso ^Z [1]+ Stopped wget -nv http://download.server.org/linux_image_1.iso user@samsunglaptop:~$
Man erhält als Ausgabe die Jobnummer (hier also 1), den Status des Jobs ("Stopped") sowie den kompletten aufgerufenen Befehl.
Will man einen im Hintergrund laufenden Prozess aus dem Hintergrund in den Vordergrund holen, so geschieht dies mit Hilfe des Befehls fg mit folgender Syntax:
fg %Jobnummer
Beispiel:
user@laptop:~$ wget -nv http://download.server.org/linux_image_1.iso & [1] 5434 user@laptop:~$ fg %1 wget -nv http://download.server.org/linux_image_1.iso & 21:08:06 URL:http://download.server.org/linux_image_1.iso [1782732/1782732] -> "linux_image_1.iso" [1] user@laptop:~$
Mit Hilfe des Befehls bg kann man einen Prozess in den Hintergrund verschieben. Dazu muss der Prozess zuerst gestoppt werden, dann kann bg ausgeführt werden. Die allgemeine Syntax von bg lautet:
bg %Jobnummer
Beispiel:
user@laptop:~$ wget -nv http://download.server.org/linux_image_1.iso ^Z [1]+ Stopped wget -nv http://download.server.org/linux_image_1.iso user@laptop:~$ bg %1 [1]+ wget -nv http://downloard.server.org/linux_image_1.iso & user@laptop:~$ jobs [1]+ Running wget -nv http://download.server.org/linux_image_1.iso & user@laptop:~$
Mit Hilfe des Befehls kill lassen sich (Hintergrund-)Prozesse vorzeitig beenden. Die allgemeine Syntax lautet:
kill %Jobnummer
Der Befehl kill kann auch zum systemweiten (nicht auf die aktuelle Shell bezogenen) Beenden von Prozessen benutzt werden - siehe entsprechender Eintrag im Wiki.
Startet man einen Befehl als Hintergrundprozess, so steht die Shell normalerweise sofort für weitere Befehle zur Verfügung. Laufen mehrere Prozesse im Hintergrund, man benötigt aber z.B. das Ergebnis eines dieser Jobs, so kann man mit dem Befehl wait die Shell anweisen, auf das Beenden des Jobs zu warten. Die allgemeine Syntax lautet:
wait %Jobnummer
Die Shell wartet dann auf das Beenden des spezifizierten Jobs. Bis dahin steht auch kein Prompt zur Verfügung. Wird wait ohne Angabe einer Jobnummer aufgerufen, wartet die Shell bis zum Beenden aller Hintergrundprozesse. Wait wird beim "normalen" Arbeiten auf der Shell eher selten gebraucht, kann aber in Skripten nützlich sein.
Möchte man aus bestimmten Gründen, dass ein Prozess auch nach dem Abmelden von der Shell weiter läuft (z.B. eine Datensicherung über den Befehl dd), so kann man dies der Shell über den Befehl nohup mitteilen. Der Syntax lautet:
nohup %Jobnummer
Somit erhält der im Aufruf spezifizierte Hintergrundprozess beim Schließen der Shell kein kill-Signal. Weitere Informationen erhält man im zugehörigen Wiki-Artikel.
Mit Hilfe des Befehls disown können in der Jobtabelle aufgeführte Jobs gestoppt bzw. beeinflusst werden. Der allgemeine Syntax lautet:
disown <Option> [%Jobnummer]
disown kennt drei Optionen:
| disown - Optionen | |
| Option | Beschreibung |
-h | hangup - Der spezifizierte Job läuft auch nach dem Abmelden von der Shell weiter (siehe auch Befehl nohup). |
-r | running - Alle laufenden Prozesse werden abgebrochen, es muss keine Jobnummer angegeben werden. |
-a | all - Alle Prozesse (unabhängig von deren Status) werden abgebrochen, es muss keine Jobnummer angegeben werden. |
Beispiel:
user@laptop:~$ wget -nv http://download.server.org/linux_image_1.iso & [1] 5741 user@laptop:~$ wget -nv http://download.server.org/linux_image_2.iso & [2] 5743 user@laptop:~$ fg %1 wget -nv http://download.server.org/linux_image_1.iso ^Z [1]+ Stopped wget -nv http://download.server.org/linux_image_1.iso & user@laptop:~$ jobs [1]+ Stopped wget -nv http://download.server.org/linux_image_1.iso [2]- Running wget -nv http://download.server.org/linux_image_2.iso & user@laptop:~$ disown -r user@laptop:~$ jobs [1]+ Stopped wget -nv http://download.server.org/linux_image_1.iso user@laptop:~$
Hintergrundprozesse und Jobkontrolle sind vor allem für Systeme ohne grafische Benutzeroberfläche oder Single-User-Systeme interessant. Benutzt man eine grafische Benutzeroberfläche, so können alternativ entweder mehrere Terminals geöffnet werden, oder - etwas eleganter - ein Terminal mit mehreren Reitern geöffnet werden (GNOME-Terminal: ⇧ + Strg + T, Xfce-Terminal: ⇧ + Strg + T, KDE-Terminal: ⇧ + Strg + N.
Eine weitere Alternative zum parallelen Ausführen von mehreren Prozessen in einer Shell ist screen.
Diese Revision wurde am 21. Januar 2010 um 17:21 Uhr
von mapserver erstellt.
Dieser Seite wurden folgende Begriffe zugeordnet:
multitasking, PID, prozesse, jobs, Shell
2004 – 2010 ubuntuusers.de • Einige Rechte vorbehalten