Jobs (&, jobs, nohup)
Prozesse & System
Vordergrund und Hintergrund
Wenn du in der Shell ein Programm startest, läuft es normalerweise im Vordergrund: Das Terminal ist blockiert, bis das Programm fertig ist. Bei lang laufenden Aufgaben möchtest du das Terminal aber weiter nutzen. Dafür gibt es Jobs – Prozesse, die die Shell im Hintergrund verwaltet. So bleibt deine Sitzung frei.
Ein Programm im Hintergrund starten
Hängst du ein kaufmännisches Und (&) an einen Befehl, startet er sofort im Hintergrund. Die Shell zeigt dir die Job-Nummer in eckigen Klammern und die PID.
$ ./backup.sh & [1] 4821
Läuft ein Programm bereits im Vordergrund, kannst du es mit Strg+Z anhalten (pausieren). Es wird dann gestoppt, aber nicht beendet.
$ ping oen.de ^Z [1]+ Stopped ping oen.de
jobs, fg und bg
Mit jobs siehst du alle Jobs der aktuellen Shell. Mit fg (foreground) holst du einen Job zurück in den Vordergrund, mit bg (background) lässt du einen gestoppten Job im Hintergrund weiterlaufen.
$ jobs [1]- Stopped ping oen.de [2]+ Running ./backup.sh & $ fg %1 # Job 1 in den Vordergrund $ bg %1 # Job 1 im Hintergrund fortsetzen
| Aktion | Befehl / Taste |
|---|---|
| Im Hintergrund starten | befehl & |
| Vordergrund-Job pausieren | Strg+Z |
| Jobs auflisten | jobs |
| In Vordergrund holen | fg %n |
| Im Hintergrund fortsetzen | bg %n |
nohup und disown: Jobs überleben lassen
Ein Problem: Schließt du das Terminal oder beendest die SSH-Sitzung, erhalten deine Hintergrund-Jobs das Signal SIGHUP und werden beendet. Um das zu verhindern, gibt es zwei Wege. nohup ignoriert das HUP-Signal von vornherein und schreibt die Ausgabe in nohup.out:
$ nohup ./langer_job.sh & nohup: ignoring input and appending output to 'nohup.out'
Hast du einen Job vergessen mit nohup zu starten, kannst du ihn nachträglich mit disown von der Shell abkoppeln:
$ disown %1 $ disown -h %1 # nur vor HUP schützen, im Job-Index belassen
Hinweise & Sicherheit
Jobs sind immer an die jeweilige Shell gebunden – in einem anderen Terminal siehst du sie nicht. Für dauerhaft laufende Dienste sind Jobs nicht gedacht; dafür nutzt du besser systemd-Dienste, die nach einem Neustart automatisch wieder starten und sauber protokolliert werden. Für interaktive, langlebige Sitzungen sind Werkzeuge wie tmux oder screen komfortabler als nohup. Achte außerdem darauf, dass mit nohup gestartete Prozesse weiterlaufen, auch wenn du sie längst vergessen hast – prüfe regelmäßig mit ps, was auf deinem System aktiv ist.