Wiki

Shell/Prozesssteuerung

Prozesssteuerung

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).

Hinweis:

Wenn im folgenden über Prozesse bzw. Jobs gesprochen wird, so sind damit nur Prozesse gemeint, welche in der aktuellen Shell gestartet wurden. Ein komplette Übersicht über alle auf dem Computer laufenden Prozesse erhält man mit ps oder pstree.

Anzeigen von Prozessen - jobs

Mit dem Befehl jobs werden alle aktuellen Jobs anzeigt. Die allgemeine Syntax lautet:

jobs <Optionen> 

jobs kennt die folgenden Optionen:

jobs - Optionen
OptionBeschreibung
-lZeigt zusätzlich die PID (Prozessidentifikationsnummer) der Prozesse an.
-pZeigt nur die PID(s) an.
-nZeigt nur die seit dem letzten Aufruf von jobs veränderten Angaben an.
-rZeigt nur aktuell laufende Prozesse an.
-sZeigt 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.

Befehle im Hintergrund laufen lassen - &

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.

Hinweis:

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.

Prozesse anhalten - ^Z

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.

Prozesse in den Vordergrund holen - fg

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:~$  

Prozesse in den Hintergrund verschieben - bg

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:~$ 

Prozesse vorzeitig beenden - kill

Mit Hilfe des Befehls kill lassen sich (Hintergrund-)Prozesse vorzeitig beenden. Die allgemeine Syntax lautet:

kill %Jobnummer 

Hinweis:

Der Befehl kill kann auch zum systemweiten (nicht auf die aktuelle Shell bezogenen) Beenden von Prozessen benutzt werden - siehe entsprechender Eintrag im Wiki.

Warten auf Beenden von Hintergrundjobs - wait

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.

Prozesse auch nach dem Abmelden weiterlaufen lassen - nohup

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.

Jobtabelle modifizieren - disown

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
OptionBeschreibung
-hhangup - Der spezifizierte Job läuft auch nach dem Abmelden von der Shell weiter (siehe auch Befehl nohup).
-rrunning - Alle laufenden Prozesse werden abgebrochen, es muss keine Jobnummer angegeben werden.
-aall - 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:~$ 

Alternativen

  • 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

Passwort vergessen?