QuickTipp: Kommandos im Hintergrund starten mit nohup

Programme, die innerhalb einer Shell – z. B. /bin/bash – gestartet werden warten, normalerweise, auf das Ende ihrer Ausführung und belegen in der Zeit die Konsole.

Einfach lässt sich dies durch das Kommando sleep darstellen:

tux@linux ~ $ sleep 10

Erst 10 Sekunden nach dem Start des Kommandos erscheint ein neuer Prompt und es werden neue Kommandos ausgeführt. Zwar kann man während das Kommando sleep die Konsole belegt schon neue Kommandos eingeben, aber die eigentliche Ausführung startet erst nach Ende des vorherigen Kommandos.

Was passiert nun, wenn das Kommando in eine Shell eingegeben wurde, die über SSH oder ein Fenster unter der graphischen Oberfläche aufgerufen wurde und die Verbindung oder das Fenster geschlossen werden?

Die Definition ist hier recht einfach: Wird einem Prozess der Ausgabekanal an den er gebunden ist entzogen – durch einen Verbindungsabbruch oder Schließen des Fensters – so wird der Prozess beendet.

Um dies zu Verbindern können Prozesse schon beim Start von den Ein- und Ausgabekanälen abgekoppelt und damit vor einem Abbruch durch Verbindungsverlust zum Ausgabekanal geschützt werden.

Dies kann über das Kommando nohup geschehen, der den Ein- und Ausgabekanal des angegebenen Kommandos umleitet. Der Eingabekanal wird hierbei geschlossen und der Ausgabekanal in die Datei nohup.out umgeleitet.

tux@linux ~ $ nohup sleep 10
nohup: ignoriere Eingabe und hänge Ausgabe an 'nohup.out' an

Das Kommando belegt aber weiterhin die Konsole und die neue Eingabeaufforderung erscheint erst nach Ende des Kommandos.

Um das Kommando zusätlich noch im Hintergrund zu starten nutzt man das Job-Management der Shell und fügt an das Kommando den Parameter & an. Dieser fordert die Shell auf das Kommando im Hintergrund laufen zu lassen und nicht die Konsole bis zum Ende der Ausführung zu belegen. Das Kommando wird hierfür in einem Unterprozess der aktuellen Shell gestartet.

tux@linux ~ $ nohup sleep 10 &
[1] 16131
nohup: ignoriere Eingabe und hänge Ausgabe an 'nohup.out' an
tux@linux ~ $

Über die Kommandos jobs, fg und bg sowie der Tastenkombination STRG+z kann mit dem im Hintergrund laufenden Job gearbeitet werden.

Zusätzlich macht es Sinn sich die Kommandos screen und/oder tmux anzuschauen, die es dem Anwender ermöglichen eine Shell auch nach einem Verbindungsverlust weiterzuführen.