Bei nohup handelt es sich um einen POSIX-Befehl, um das Unix-Signal „HUP“ (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.
Weblinks
Einzelnachweise
- ↑ Re: nohup/disown and logout. Zsh.org, 7. Februar 2005, abgerufen am 10. Juni 2009.
- ↑ gnu.org
- ↑ gnu.org
- ↑ publib.boulder.ibm.com
- ↑ SSH Frequently Asked Questions. Snailbook.com, abgerufen am 10. Juni 2009.
- ↑ 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
- ↑ Bug 396 – sshd orphans processes when no pty allocated. Bugzilla.mindrot.org, abgerufen am 10. Juni 2009.