Prozesssteuerung
Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:
Dieser Artikel ist größtenteils für alle Ubuntu-Versionen gültig.
Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:
Ein Prozess ist die laufende Instanz eines Programms/Befehls und wird durch einen numerischen Schlüssel, den Process Identifier (kurz: PID), repräsentiert. Der PID ist einmalig und hat seinen eigenen, privaten Arbeitsbereich im Speicher (RAM), der vor dem Zugriff durch andere Programme geschützt ist - er ändert sich während der Laufzeit nicht. Unter Linux und damit auch unter Ubuntu unterscheidet man zwischen verschiedenen Arten von Prozessen. „Normale“ Programme können über Signale mittels verschiedener Programme/Befehle in der Shell[2] oder mit grafischen Programmen der jeweiligen Desktopumgebung manipuliert werden, wobei sich diese Manipulation i.d.R. auf Abfragen, Stoppen und wieder Starten sowie das vorzeitige Beenden beschränken.
Hinweis:
In diesem Artikel werden nur Prozesse behandelt, die in der aktuellen Shell [2] gestartet werden und zusätzlich zur PID über eine Jobnummer identifiziert werden können. Bei allen Befehlen handelt es sich um eingebaute Befehle der Shell (siehe man bash-builtins) und nicht um Programme - Ausnahme: nohup.
Beschreibung¶
Prozesse können u.a. direkt im Hintergrund gestartet, in den Hintergrund verlagert oder in den Vordergrund geholt werden, man kann sie abbrechen, unterbrechen und wieder anstarten sowie sie von der aktuellen Shell abkoppeln. Es können ohne weiteres auch mehrere Prozesse im Hintergrund laufen (Multitasking). Inhalt dieses Artikels ist, wie man in der Shell gestartete Prozesse steuern kann. Hinweise zur allgemeinen Prozesssteuerung findet man unter den Links.
Achtung!
Alle gestarteten Prozesse benutzen die Standardein-/-ausgaben der Shell[2]. Schließt man das aktuelle Terminal[1], so wird an alle laufenden Jobs ein Signal gesendet und sie brechen, da die Verbindung zur Ein-/Ausgabe-Shell beendet wird, ab. Um dies zu umgehen kann man die Jobs von der Shell abkoppeln.
Anzeige von gestarteten Prozessen¶
Mit dem Befehl jobs
werden alle laufenden Prozesse (Kindprozesse des Shell-Prozesses) innerhalb der aktuellen Shell[2] angezeigt.
jobs <Optionen>
jobs Optionen | |
Option | Beschreibung |
-l | Zeigt zusätzlich die PID 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. |
Alle aktuell laufenden Prozesse innerhalb der Shell anzeigen:
user@laptop:~$ jobs [1]+ Angehalten wget -nv http://download.example.org/linux_image_1.iso [2]- Läuft wget -nv http://download.example.org/linux_image_2.iso &
Es wird die Jobnummer, der aktuelle Jobstatus sowie der komplette Aufruf-Befehl (hier: wget) angezeigt.
Prozess im Hintergrund starten - &¶
Hinweis:
Prozesse, die im Hintergrund laufen, benutzen immer noch die Standardein-/-ausgaben der Shell[2]. Dies ist nur dann sinnvoll, wenn der Prozess eine längere Zeit braucht (z.B. Klonen von Partition), keine/kaum Eingaben abfragt und nichts/wenig im Terminal[1] ausgibt. Aus diesem Grund wird in allen Beispielen der Befehl wget mit der Option -nv
(--non-verbose
) genutzt.
Um einen Befehl oder Prozess sofort im Hintergrund laufen zu lassen, hängt man einfach ein &
(Kaufmanns-Und) an den Befehl an:
wget -nv http://download.example.org/linux_image_1.iso &
[1] 5434
Als Information bekommt man die Jobnummer innerhalb der Shell (hier: [1]
) sowie die PID (hier: 5434) im System angezeigt. Danach wird der Bildschirm freigegeben und man erhält den normalen Eingabe-Prompt für weitere Aufgaben zurück. Mit den im folgenden beschriebenen Befehlen kann man dann die weitere Verarbeitung der einzelnen Jobs manipulieren.
Prozess abbrechen - ^C¶
Mit der Tastenkombination Strg + C können laufende Prozesse der Shell[2] beendet werden. Der Prozess muss dafür im Vordergrund laufen!
wget -nv http://download.example.org/linux_image_1.iso ^C
Prozess anhalten - ^Z¶
Mit der Tastenkombination Strg + Z können laufende Prozesse der Shell[2] pausiert werden. Der Prozess muss dafür im Vordergrund laufen!
wget -nv http://download.example.org/linux_image_1.iso ^Z
[1]+ Angehalten wget -nv http://download.example.org/linux_image_1.iso
Man erhält die Jobnummer, den neuen Status des Jobs sowie den kompletten Aufruf-Befehl als Information zurück.
Prozess in den Hintergrund - bg¶
Mit Hilfe des Befehls bg
wird ein angehaltener Job der Shell[2] in den Hintergrund verschoben und wieder gestartet:
bg %Jobnummer [1]+ wget -nv http://download.example.org/linux_image_1.iso &
Man bekommt die Jobnummer und den ursprünglichen Aufruf-Befehl mit & ausgegeben. Beispiel einer kompletten Eingabefolge mit Job-Abfrage:
wget -nv http://download.example.org/linux_image_1.iso ^Z
[1]+ Angehalten wget -nv http://download.example.org/linux_image_1.iso
bg %1
[1]+ wget -nv http://download.example.org/linux_image_1.iso &
jobs
[1]+ Läuft wget -nv http://download.example.org/linux_image_1.iso &
Ruft man bg
oder fg
ohne Parameter auf, wird der zuletzt gestartete Prozess (in der Ausgabe von jobs
mit einem +
markiert) in den Vorder- bzw. Hintergrund geholt.
Prozess in den Vordergrund - fg¶
Will man einen im Hintergrund der Shell[2] laufenden Prozess in den Vordergrund holen oder einen angehaltenen Job fortsetzen, nutzt man fg
:
wget -nv http://download.example.org/linux_image_1.iso &
[1] 5434
fg %1
wget -nv http://download.example.org/linux_image_1.iso & 21:08:06 URL:http://download.example.org/linux_image_1.iso [1782732/1782732] -> "linux_image_1.iso" [1]
Warten auf Prozess - wait¶
Startet man einen Befehl als Hintergrundprozess, so steht die Shell[2] normalerweise sofort für weitere Eingaben bereit. Laufen mehrere Prozesse im Hintergrund und man benötigt das Ergebnis eines dieser Jobs, so kann man mit dem Befehl wait
die Shell anweisen, auf das Beenden des Jobs zu warten. Mit
wait %Jobnummer
wartet die Shell und bis dahin steht auch kein Prompt zur Verfügung. Wird wait
ohne Angabe einer Jobnummer aufgerufen, dann wartet die Shell auf alle Hintergrundprozesse. Im normalen Alltag auf der Shell wird wait
eher selten gebraucht, es kann aber in Skripten nützlich sein.
Prozess von der Shell abkoppeln¶
Möchte man das Terminal[1] beenden, aber die gestarteten Programme laufen noch im Vorder- oder auch im Hintergrund, dann muss man diese vorher von der Shell[2] abkoppeln. Dazu gibt es verschiedene Möglichkeiten, den integrierten Befehl disown, das Programm nohup oder auch den Fenstermanager screen.
Jobs modifizieren - disown¶
Mit disown
können Jobs der Shell[2] gestoppt bzw. beeinflusst werden. Die allgemeine Syntax lautet:
disown <Option> [%Jobnummer]
Wird keine Jobnummer angegeben, dann bezieht sich das Kommando auf den zuletzt gestarteten Job in der Shell .
Optionen zu disown | |
Option | Beschreibung |
-h | Beim schließen des Terminals[1] wird kein Signal -HUP gesendet, das Programm läuft weiter. |
-r | Der laufende Prozess wird abgebrochen. |
-a | Alle Prozesse (unabhängig von deren Status) werden abgebrochen. |
Um einen Job beim schließen des Terminals weiterlaufen zu lassen gibt man folgendes ein:
wget -nv http://download.example.org/linux_image_1.iso &
[1] 5741
disown -h 5741
Gleichen Befehl kann man auch benutzen um ein Programm von vornherein vom Terminal[1] abzulösen:
wget -nv http://download.example.org/linux_image_1.iso & disown
Prozess starten mit nohup
¶
Weiß man vorher, dass der Prozess lange dauert und das Terminal[1] schließen will, so kann man das der Shell[2] über das Programm nohup mitteilen.
nohup wget -nv http://download.example.org/linux_image_1.iso &
Jetzt kann man das Terminal schließen, ohne dass ein Beenden-Signal abgesetzt wird. Man sollte dabei beachten, dass evtl. Ausgaben dann in eine Datei nohup.out
geschrieben werden.
Alternativen¶
Hintergrundprozesse und Jobkontrolle sind vor allem für Systeme ohne grafische Benutzeroberfläche oder Single-User-Systeme interessant. Ein Anwendungsfall stellt z.B. die Administration mittels SSH dar. Screen und tmux sind sog. Terminal-Multiplexer, die es ermöglichen, Prozesse weiterlaufen zu lassen (auch wenn das Terminal[1] geschlossen wird).
Benutzt man eine grafische Benutzeroberfläche, so gibt es mehrere Alternativen, um mehrere Prozesse zu verwalten.
Man benutzt mehrere Terminals, evtl. auch auf mehreren virtuellen Arbeitsflächen.
Man öffnet mehrere Reiter (Tabs) in einem Terminal.
z.B. beim GNOME-Terminal mit ⇧ + Strg + T oder über das terminaleigene Datei-Menü.
z.B. beim KDE-Terminal mit ⇧ + Strg + N oder über das terminaleigene Datei-Menü.
Andere Terminals sowie die von LXDE oder Xfce bringen diese oder eine ähnliche Funktion mit.
Man benutzt eine der nicht grafischen Konsolen, die man über Strg + Alt + F1 bis Strg + Alt + F6 erreicht (Rücksprung ins grafische System mit Strg + Alt + F7 ).
Links¶
Systemüberwachung - Befehle/Programme zur Systemüberwachung
Prozesssteuerung - Befehle/Programme um Prozesse zu Steuern
Video vom Kommandozeilenworkshop Teil 6 Job Control - Ubucon 2010
Die Bash - Prozesskontrolle - Allgemeine Einführung