VMware ESXi and vSphere Cluster Management

Vordergrund- und Hintergrundprozesse unter Linux

Lerne unter Linux die Jobsteuerung mit &, Strg+Z, jobs, fg und bg kennen. Mit sicheren Beispielen, Umleitungen und Troubleshooting.

Wenn du einen Befehl in einer interaktiven Shell startest, läuft er normalerweise im Vordergrund. Die Shell wartet dann, bis das Programm endet oder angehalten wird. Währenddessen kannst du in derselben Shell gewöhnlich keinen neuen Befehl eingeben.

Ein Hintergrundprozess läuft dagegen weiter, während die Shell bereits wieder einen Prompt anzeigt und neue Befehle entgegennimmt. Interaktive Shells verwalten solche Ausführungen als Jobs. Die Jobsteuerung erlaubt unter anderem das Anzeigen, Anhalten und Fortsetzen dieser Jobs.

Prozess und Job: zwei unterschiedliche Begriffe

Ein Prozess ist eine vom Betriebssystem verwaltete laufende Programmausführung. Jeder einzelne Prozess besitzt eine numerische Prozess-ID, kurz PID.

Ein Job ist dagegen eine Ausführung, die von der aktuellen interaktiven Shell verwaltet wird. Die Shell vergibt dafür eine lokale Jobnummer, zum Beispiel [1]. Bei komplexeren Befehlen kann ein Job auch aus mehreren zusammengehörenden Prozessen bestehen.

MerkmalJobnummerProzess-ID
VergabeVon der interaktiven ShellVom Betriebssystem
GültigkeitsbereichAktuelle Shell-SitzungSystemweit eindeutig, solange der Prozess existiert
Beispielsyntax%1Zum Beispiel 4821
Verwendung mit Shell-Built-insFür fg, bg und jobsNicht direkt als Jobnummer für diese Befehle

Die Nummer [1] und eine eventuell angezeigte PID sind daher nicht dasselbe. Jobnummern gelten nur innerhalb der Shell, die den Job gestartet hat. Der Befehl jobs zeigt insbesondere nicht automatisch alle Prozesse des Systems.

Vordergrund und Hintergrund im Vergleich

ZustandLäuft der Prozess?Ist das Terminal für neue Befehle verfügbar?Kann der Job Terminaleingaben verwenden?
VordergrundJaNein, die Shell wartet normalerweiseJa, sofern das Programm Eingaben erwartet
HintergrundJaJa, die Shell nimmt neue Befehle anNormalerweise nicht zuverlässig; ein Eingabeversuch kann den Job anhalten
AngehaltenNein, vorübergehend suspendiertJaNein, bis der Job fortgesetzt wird

Ein Vordergrundjob verwendet das steuernde Terminal. Ein Hintergrundjob kann weiterhin an dasselbe Terminal angeschlossen sein. Deshalb können seine normale Ausgabe und seine Fehlermeldungen auch dann am Bildschirm erscheinen, wenn du gerade einen anderen Befehl eingibst.

Einen Befehl direkt im Hintergrund starten

Setze ein kaufmännisches Und, den Ampersand &, an das Ende eines Befehls:

sleep 120 &

sleep wartet hier 120 Sekunden. Es ist für Übungen geeignet, weil es keine Dateien verändert und keine interaktive Eingabe benötigt. Die Shell zeigt typischerweise eine Ausgabe ähnlich der folgenden:

[1] 4821

[1] ist die Jobnummer, 4821 beispielhaft die Prozess-ID. Danach erscheint der Shell-Prompt normalerweise sofort wieder.

jobs

Eine mögliche Ausgabe ist:

[1]+  Running                 sleep 120 &

Das Pluszeichen markiert häufig den aktuellen Standardjob. Die genaue Darstellung kann je nach Shell variieren. Auch ein Hintergrundprogramm kann Text in das Terminal schreiben. Das kann die aktuelle Eingabezeile unübersichtlich machen.

Programme, die Eingaben vom Terminal erwarten, solltest du nicht unbedacht mit & starten. Ein Hintergrundjob darf das steuernde Terminal normalerweise nicht einfach für Eingaben verwenden. Je nach Situation wird er deshalb angehalten oder kann nicht weiterarbeiten.

Einen Vordergrundjob mit Strg+Z anhalten

Starte zunächst einen ungefährlichen, länger laufenden Befehl im Vordergrund:

sleep 120

Der Prompt erscheint erst nach Ablauf der Wartezeit. Drücke währenddessen Strg+Z. Diese Tastenkombination veranlasst das Terminal typischerweise, das Signal SIGTSTP an den Vordergrundjob zu senden.

^Z
[1]+  Stopped                 sleep 120

Der Job wurde nicht beendet. Er ist suspendiert, also vorübergehend angehalten, und existiert weiterhin. Der Status heißt in vielen Shell-Ausgaben Stopped. Die Shell kann nun wieder Befehle entgegennehmen.

Strg+Z und Strg+C haben unterschiedliche Wirkungen:

  • Strg+Z: hält den aktuellen Vordergrundjob normalerweise an; der Prozess bleibt vorhanden.
  • Strg+C: sendet normalerweise ein Unterbrechungssignal und beendet den Prozess häufig. Ein Programm kann dieses Signal jedoch behandeln oder ignorieren.

Ein angehaltener Prozess führt keine Arbeit aus. Bei Datei- oder Geräteoperationen bedeutet das auch, dass die betreffende Operation pausieren kann. Das Anhalten macht einen Befehl weder rückgängig noch ungefährlich.

Jobs anzeigen und identifizieren

Mit jobs listest du die Jobs der aktuellen Shell auf:

jobs

Typische Zustände sind:

  • Running: Der Job läuft, während die Shell weitere Befehle akzeptiert.
  • Stopped: Der Job ist angehalten und arbeitet momentan nicht.

Beispiel:

[1]-  Stopped                 sleep 120
[2]+  Running                 sleep 180 &

Die Jobnummern sind in diesem Beispiel 1 und 2. Für Shell-Befehle wie fg und bg sprichst du sie mit einem Prozentzeichen an, also etwa %1 oder %2.

Angehaltene Jobs fortsetzen

Mit fg im Vordergrund fortsetzen

fg holt einen Job in den Vordergrund. Ohne Angabe verwendet die Shell normalerweise den aktuellen Job:

fg

Ein bestimmter Job wird mit seiner Jobkennung ausgewählt:

fg %1

Danach erhält der Job wieder das steuernde Terminal. Die Shell wartet, bis er endet oder erneut angehalten wird.

Mit bg im Hintergrund fortsetzen

bg setzt einen zuvor angehaltenen Job im Hintergrund fort:

bg

Für einen bestimmten Job verwendest du beispielsweise:

bg %1

Das Kommando ändert nicht nur die Statusanzeige. Es veranlasst die Shell tatsächlich, den angehaltenen Job weiterlaufen zu lassen, während sie den Prompt wieder freigibt.

Mehrere Jobs gezielt verwalten

sleep 180 &
sleep 240 &
jobs
fg %2

Mit fg %2 holst du gezielt den zweiten Shell-Job in den Vordergrund. Welche Jobnummer ein Befehl erhält, hängt von der aktuellen Shell-Sitzung ab. Prüfe sie deshalb mit jobs, statt eine Nummer zu erraten.

EingabeWirkungTypischer Einsatz
Befehl &Startet den Befehl im HintergrundNichtinteraktive, länger laufende Aufgabe
Strg+ZHält den aktuellen Vordergrundjob anTerminal vorübergehend freigeben
jobsListet die Jobs der aktuellen Shell aufJobnummer und Status prüfen
bgSetzt den aktuellen angehaltenen Job im Hintergrund fortWeiterarbeiten ohne belegtes Terminal
bg %nSetzt Job n im Hintergrund fortBestimmten Job auswählen
fgSetzt den aktuellen Job im Vordergrund fortInteraktive Arbeit oder Ausgabe beobachten
fg %nHolt Job n in den VordergrundBestimmten Job auswählen
Strg+CUnterbricht den Vordergrundjob normalerweiseAktuelle Ausführung beenden

Ausgaben und Eingaben bei Hintergrundjobs

Das Starten mit & trennt die Ausgabe nicht automatisch vom Terminal. Ein Programm kann daher Meldungen zwischen deine Eingabe schreiben. Für nichtinteraktive Aufgaben ist eine Umleitung in eine Protokolldatei oft übersichtlicher.

sh -c 'for i in 1 2 3; do echo "Schritt $i"; sleep 2; done' > fortschritt.log 2>&1 &
  • > fortschritt.log leitet die Standardausgabe in die Datei um.
  • 2>&1 leitet die Standardfehlerausgabe auf dasselbe Ziel wie die Standardausgabe um.
  • & startet die so umgeleitete Befehlsausführung im Hintergrund.

Den bisherigen Inhalt kannst du anschließend lesen:

jobs
cat fortschritt.log

Ein Hintergrundjob, der vom Terminal lesen möchte, kann angehalten werden. Geeignete Lösungen sind ein Vordergrundbetrieb, Eingaben aus einer Datei oder Pipe oder eine ausdrücklich nichtinteraktive Betriebsart des Programms.

Ein sicherer Ablauf zum Üben

  1. Starte sleep 120 im Vordergrund.
  2. Drücke Strg+Z und prüfe mit jobs den Status Stopped.
  3. Führe bg aus und prüfe erneut mit jobs den Status Running.
  4. Hole den Job mit fg zurück in den Vordergrund.
  5. Beende ihn bei Bedarf mit Strg+C oder warte, bis er endet.

Für Übungen eignen sich reine Wartebefehle oder Befehle, die in eine eindeutig benannte Testdatei schreiben. Sei bei dd besonders vorsichtig:

dd if=/dev/zero of=testdatei.img bs=1M count=64 status=progress &
jobs

Dieses Beispiel schreibt in die Datei testdatei.img. Verwende niemals unüberlegt ein Blockgerät als Ziel. Ein Tippfehler bei of= kann Daten zerstören. Der Hintergrundstatus ändert nichts an der Wirkung und senkt kein Risiko.

Grenzen der einfachen Jobsteuerung

Ein mit & gestarteter Job ist nicht automatisch dauerhaft unabhängig von Terminal und Shell. Beim Schließen des Terminals oder beim Abmelden kann ein SIGHUP-Signal relevant werden. Je nach Shell, Programm und Konfiguration kann der Prozess dadurch beendet werden oder seine Verbindung zur Sitzung verlieren.

Für Aufgaben, die auch nach dem Abmelden zuverlässig weiterlaufen sollen, kommen andere Mechanismen infrage:

  • nohup kann einen Befehl gegenüber einem Hangup robuster machen.
  • tmux und screen halten eine Terminalsitzung getrennt vom aktuellen Verbindungsfenster offen.
  • systemd eignet sich für dauerhaft betriebene Dienste und geplante, systemweit verwaltete Aufgaben.

Diese Werkzeuge lösen andere Anforderungen. Für die unmittelbare Steuerung innerhalb einer interaktiven Shell bleiben jobs, fg, bg, Strg+Z und Strg+C die grundlegenden Befehle.

Fehlerbehebung

Nach Strg+Z arbeitet der Befehl nicht weiter

Das ist erwartbar: Der Job wurde angehalten, nicht beendet. Prüfe den Zustand und setze ihn fort:

jobs
bg

Wenn der Job das Terminal wieder im Vordergrund benötigt, verwende stattdessen fg.

fg oder bg verwendet den falschen Job

Bei mehreren Jobs ist der aktuelle Standardjob möglicherweise nicht der gewünschte. Ermittle zuerst die Nummer:

jobs
fg %2

Ersetze %2 durch die tatsächlich angezeigte Jobkennung.

Ausgabe erscheint mitten in der Eingabezeile

Die Standardausgabe oder Standardfehlerausgabe ist noch mit dem Terminal verbunden. Starte den Befehl mit einer Umleitung:

langlaufender-befehl > ausgabe.log 2>&1 &

Ein Hintergrundprogramm kann nicht weiterlesen

Wahrscheinlich erwartet es Eingaben vom Terminal. Hole es mit fg in den Vordergrund oder versorge es über eine Datei, eine Pipe oder eine geeignete nichtinteraktive Option mit Eingaben.

Der Prozess verschwindet nach dem Schließen des Terminals

Die einfache Jobsteuerung bindet Jobs häufig an die Shell- und Terminalsitzung. Für unabhängige Langläufer sind nohup, tmux, screen oder ein systemd-Dienst geeigneter.

Ein dd-Befehl verursacht Datenverlust

Prüfe besonders die Angabe nach of=. Nutze für Übungen ausschließlich eine Testdatei und kontrolliere Quelle und Ziel vor dem Start. Ein angehaltener dd-Prozess kann eine Datei- oder Geräteoperation lediglich pausieren; er macht sie nicht rückgängig.

Merksätze für die Prüfung

  • Ein normal gestarteter Befehl läuft zunächst im Vordergrund und belegt das steuernde Terminal.
  • & startet einen Befehl im Hintergrund, trennt ihn aber nicht automatisch dauerhaft vom Terminal.
  • Strg+Z suspendiert den Vordergrundjob typischerweise mit SIGTSTP; Strg+C unterbricht ihn normalerweise.
  • jobs zeigt nur Jobs der aktuellen interaktiven Shell.
  • fg setzt einen Job im Vordergrund fort, bg im Hintergrund.
  • Mit %1 adressierst du Jobnummer 1; eine PID ist eine andere Kennung.
  • Hintergrundausgaben können das Terminal stören. Umleitungen wie > ausgabe.log 2>&1 schaffen Abhilfe.

Die grundlegenden Zustandswechsel lassen sich als Vordergrund → Strg+Z → angehalten → bg → Hintergrund sowie Hintergrund → fg → Vordergrund zusammenfassen.

Weiterführend: Vorder- und Hintergrundprozesse unter Linux.