Nohup

Bei nohup handelt es sich um einen POSIX-Befehl, um das Unix-SignalHUP“ (hangup) zu ignorieren. Jenes Signal wird von einem Terminal verwendet, um abhängige Prozesse über einen Logout zu benachrichtigen. In der Regel würden abhängige Prozesse des Terminals als Folge des Signalempfangs terminieren.

Unter Verwendung von nohup wird die Ausgabe des Prozesses, die eigentlich an das Terminal gehen sollte, in eine Datei namens nohup.out geschrieben, falls sie nicht bereits anderweitig umgeleitet wurde.

nohup ist ein primitives Werkzeug, welches ein Kommando so konfiguriert, dass es ein bestimmtes Signal ignoriert. Damit ist es noch weit davon entfernt, eine Lösung für alle möglichen Probleme eines asynchronen Programmbetriebs anzubieten, wie es etwa bei einem vollständigen Stapelverarbeitungssystem der Fall sein könnte.

Benutzung

Das folgende Beispiel startet das Programm foo im Hintergrund, sodass es vom nachfolgenden Logout nicht abgebrochen wird:

$ nohup foo &
$ exit

Hierdurch wird verhindert, dass der Prozess beim Logout ein STOP-Signal erhält. Wenn jedoch eine Ein-/Ausgabe über die Standard-I/O (stdin, stdout oder stderr) erfolgt, werden diese dennoch ein „Hängen“ des Terminals verursachen (siehe unten).[1]

nohup wird oftmals zusammen mit dem nice-Befehl verwendet, um die Priorität des Prozesses zu beeinflussen.

$ nohup nice abcd &

Bestehende Jobs und Prozesse

Bestimmte Shells (z. B. bash) verfügen über vorgefertigte Möglichkeiten, um das Senden oder die Weiterleitung des SIGHUP-Signals an bestehende Jobs zu unterdrücken, selbst wenn diese nicht mit nohup gestartet wurden. In bash kann dies durch die Eingabe von disown -h job erreicht werden. Wird dieses Kommando ohne Argumente aufgerufen, so wird der Job aus der Jobtabelle entfernt, was dann ebenfalls bedeutet, dass er das Signal nicht empfängt.

Bevor disown auf einen aktiven Job angewendet wird, sollte dieser mittels Strg-Z gestoppt und dann mit dem bg-Kommando in den Hintergrund verlagert werden.[2] Eine weitere relevante bash-Option ist shopt huponexit, womit dafür gesorgt werden kann, dass ein HUP-Signal automatisch an die Jobs gesendet wird, wenn die Shell auf normalem Wege beendet wird.[3]

Die AIX- und Solaris-Versionen von nohup haben eine -p-Option, die für einen laufenden Prozess bewirkt, dass er künftige SIGHUP-Signale ignoriert. Im Gegensatz zu disown, wie oben beschrieben, akzeptiert nohup -p Prozess-IDs als Parameter.[4]

Vermeidung des Terminal-Hängens

Das Anwenden von nohup auf einen Job im Hintergrund wird typischerweise genutzt, um diesen daran zu hindern, zu terminieren, wenn eine SSH-Session beendet wird. Ein anderes Problem ergibt sich, wenn SSH diesen Logout nicht zulässt („hängt“), weil keine Daten von den bzw. für die Hintergrundjobs verloren gehen sollen.[5][6] Dieses Problem kann durch Umleitung der E/A-Ströme gelöst werden:

$ nohup ./programm > foo.out 2> foo.err < /dev/null &

Weiterhin ist anzumerken, dass das Schließen einer SSH-Session nicht immer ein HUP-Signal an die abhängigen Prozesse sendet. Unter anderem ist dies davon abhängig, ob ein Pseudoterminal verwendet wurde.[7]

Alternativen

  • Das screen oder das tmux-Kommando können einen Prozess ebenso von der aktuellen Shell lösen. Eine erneute Bindung des Prozesses an die Shell zu einem späteren Zeitpunkt ist möglich.
Beispielsweise wird der folgende Aufruf script.sh ohne Beachtung von SIGHUP und im Hintergrund ausführen:
 $ screen -A -m -d -S somename ./script.sh &
  • Das disown-Kommando wird verwendet, um Jobs aus der Jobtabelle zu entfernen oder sie zu markieren, das SIGHUP-Signal nicht zu empfangen.

Einzelnachweise

  1. Re: nohup/disown and logout. Zsh.org, 7. Februar 2005, abgerufen am 10. Juni 2009.
  2. gnu.org
  3. gnu.org
  4. publib.boulder.ibm.com
  5. SSH Frequently Asked Questions. Snailbook.com, abgerufen am 10. Juni 2009.
  6. OpenSSH FAQ. Openssh.com, 20. September 2005, archiviert vom Original am 10. Juli 2009; abgerufen am 10. Juni 2009.  Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäß Anleitung und entferne dann diesen Hinweis.@1@2Vorlage:Webachiv/IABot/www.openssh.com
  7. Bug 396 – sshd orphans processes when no pty allocated. Bugzilla.mindrot.org, abgerufen am 10. Juni 2009.