[[Vorlage(Getestet, general)]] {{{#!vorlage Wissen [:Terminal:Ein Terminal öffnen] [:Shell:Was ist eine Shell] }}} [[Inhaltsverzeichnis()]] [[Bild(Wiki/Icons/terminal.png, 48, align=left)]] Ein [wikipedia:Prozess_(Informatik):Prozess] ist die laufende Instanz eines Programms/Befehls und wird durch einen numerischen Schlüssel, den [wikipedia:Process_identifier: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 [:Shell/Befehlsübersicht#Systemueberwachung:Programme/Befehle] in der Shell[2] oder mit [:Prozesse:grafischen Programmen] der jeweiligen [:Desktop:Desktopumgebung] manipuliert werden, wobei sich diese Manipulation i.d.R. auf Abfragen, Stoppen und wieder Starten sowie das vorzeitige Beenden beschränken. {{{#!vorlage 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: [:Shell/nohup: 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 Links]. {{{#!vorlage Warnung Alle gestarteten Prozesse benutzen die [:Shell/Umleitungen:Standardein-/-ausgaben] der Shell[2]. Schließt man das aktuelle Terminal[1], so wird an alle laufenden Jobs ein [:Signale: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 [#Prozess-von-der-Shell-abkoppeln abkoppeln]. }}} = Anzeige von gestarteten Prozessen = Mit dem Befehl `jobs` werden alle laufenden Prozesse (Kindprozesse des Shell-Prozesses) innerhalb der aktuellen Shell[2] angezeigt. {{{#!vorlage Befehl jobs }}} {{{#!vorlage Tabelle <-2 tablestyle="width: 65%;";rowclass="titel"> `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: {{{#!vorlage Befehl 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 - & = {{{#!vorlage 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. [:Shell/dd: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: {{{#!vorlage Befehl 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 [:Shell/Einführung#Der-Beginn-der-Prompt: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 [[Vorlage(Tasten, strg+c)]] können laufende Prozesse der Shell[2] beendet werden. Der Prozess muss dafür im Vordergrund laufen! {{{#!vorlage Befehl wget -nv http://download.example.org/linux_image_1.iso ^C }}} = Prozess anhalten - ^Z = Mit der Tastenkombination [[Vorlage(Tasten, strg+z)]] können laufende Prozesse der Shell[2] pausiert werden. Der Prozess muss dafür im Vordergrund laufen! {{{#!vorlage Befehl 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 [#Prozess-anhalten-Z angehaltener Job] der Shell[2] in den Hintergrund verschoben und wieder gestartet: {{{#!vorlage Befehl bg %Jobnummer [1]+ wget -nv http://download.example.org/linux_image_1.iso & }}} Man bekommt die Jobnummer und den ursprünglichen Aufruf-Befehl mit [#Prozess-im-Hintergrund-starten &] ausgegeben. Beispiel einer kompletten Eingabefolge mit [#Anzeige-von-gestarteten-Prozessen Job-Abfrage]: {{{#!vorlage Befehl wget -nv http://download.example.org/linux_image_1.iso ^Z }}}{{{ [1]+ Angehalten wget -nv http://download.example.org/linux_image_1.iso }}} {{{#!vorlage Befehl bg %1 }}}{{{ [1]+ wget -nv http://download.example.org/linux_image_1.iso & }}} {{{#!vorlage Befehl 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 [#Prozess-anhalten-Z angehaltenen Job] fortsetzen, nutzt man `fg`: {{{#!vorlage Befehl wget -nv http://download.example.org/linux_image_1.iso & }}}{{{ [1] 5434 }}} {{{#!vorlage Befehl 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 {{{#!vorlage Befehl 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 [:Skripte: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 [#Jobs-modifizieren-disown disown], das Programm [:Shell/nohup:nohup] oder auch den Fenstermanager [:Screen:screen]. == Jobs modifizieren - disown == Mit `disown` können Jobs der Shell[2] gestoppt bzw. beeinflusst werden. Die allgemeine Syntax lautet: {{{#!vorlage Befehl disown