Schauen wir uns zunächst an, was passiert, wenn ein Programm von einer interaktiven Shell (die mit einem Terminal verbunden ist) ohne &
(und ohne Umleitung) gestartet wird . Nehmen wir also an, Sie haben gerade Folgendes eingegeben foo
:
- Der laufende Prozess
foo
wird erstellt.
- Der Prozess erbt stdin, stdout und stderr von der Shell. Daher wird es auch an dasselbe Terminal angeschlossen.
- Wenn die Shell ein empfängt
SIGHUP
, sendet sie auch ein SIGHUP
an den Prozess (wodurch der Prozess normalerweise beendet wird).
- Andernfalls wartet die Shell (wird blockiert), bis der Prozess beendet ist.
Schauen wir uns nun an, was passiert, wenn Sie den Prozess in den Hintergrund stellen, also Folgendes eingeben foo &
:
- Der laufende Prozess
foo
wird erstellt.
- Der Prozess erbt stdout / stderr von der Shell (sodass weiterhin auf das Terminal geschrieben wird).
- Der Prozess erbt im Prinzip auch stdin, aber sobald er versucht, von stdin zu lesen, wird er angehalten.
- Es wird in die Liste der von der Shell verwalteten Hintergrundjobs aufgenommen, was insbesondere Folgendes bedeutet:
- Es wird mit aufgelistet
jobs
und kann über %n
(wo n
ist die Auftragsnummer) abgerufen werden .
- Es kann mit in einen Vordergrundjob verwandelt werden
fg
. In diesem Fall wird es so fortgesetzt, als hätten Sie es nicht verwendet &
(und wenn es aufgrund des Versuchs, von der Standardeingabe zu lesen, angehalten wurde, kann es jetzt mit dem Lesen vom Terminal fortfahren).
- Wenn die Shell ein empfangen hat
SIGHUP
, sendet sie auch ein SIGHUP
an den Prozess. Abhängig von der Shell und möglicherweise von den für die Shell festgelegten Optionen wird beim Beenden der Shell auch ein SIGHUP
an den Prozess gesendet.
Nun disown
entfernt den Auftrag aus der Auftragsliste der Schale, so dass alle Unterpunkte gelten nicht mehr (einschließlich dem Prozess eines gesendet SIGHUP
von der Shell). Beachten Sie jedoch, dass es immer noch mit dem Terminal verbunden ist. Wenn also das Terminal zerstört wird (was passieren kann, wenn es sich um ein Pty handelt, wie das, das von xterm
oder erstellt wurde ssh
, und das Steuerungsprogramm beendet wird, indem Sie das xterm schließen oder die SSH- Verbindung beenden ). schlägt das Programm fehl, sobald versucht wird, von der Standardeingabe zu lesen oder auf die Standardausgabe zu schreiben.
Was den nohup
Fall ist, auf der anderen Seite, ist effektiv aus dem Terminal , den Prozess zu trennen:
- Es schließt die Standardeingabe (das Programm wird nicht fähig sein , auch jede Eingabe zu lesen, wenn es im Vordergrund ausgeführt wird. Nicht angehalten wird, sondern einen Fehlercode oder empfangen
EOF
).
- Standardausgabe und Standardfehler werden in die Datei umgeleitet
nohup.out
, sodass das Programm beim Fehlschlagen des Terminals nicht fehlschlägt, um in die Standardausgabe zu schreiben.
- Es verhindert, dass der Prozess ein
SIGHUP
(also den Namen) empfängt .
Beachten Sie, dass nohup
sie nicht den Prozess von der Shell-Auftragssteuerung entfernen und auch nicht setzt sie nicht im Hintergrund (aber da ein Vordergrund nohup
Job mehr oder weniger nutzlos ist, würden Sie es in der Regel setzen in den Hintergrund verwenden &
). Anders als bei disown
wird Ihnen die Shell beispielsweise weiterhin mitteilen, wann der Nohup-Job abgeschlossen ist (es sei denn, die Shell wird zuvor beendet).
Um es zusammenzufassen:
&
Setzt den Job in den Hintergrund, dh, der Versuch, Eingaben zu lesen, wird blockiert, und die Shell wartet nicht auf ihren Abschluss.
disown
Entfernt den Prozess aus der Jobsteuerung der Shell, lässt ihn jedoch weiterhin mit dem Terminal verbunden. Eines der Ergebnisse ist, dass die Shell es nicht sendet SIGHUP
. Offensichtlich kann es nur auf Hintergrundjobs angewendet werden, da Sie es nicht eingeben können, wenn ein Vordergrundjob ausgeführt wird.
nohup
Trennt den Prozess vom Terminal, leitet seinen Ausgang an um nohup.out
und schirmt ihn ab SIGHUP
. Einer der Effekte (der benennende) ist, dass der Prozess keine gesendeten Nachrichten empfängt SIGHUP
. Es ist völlig unabhängig von der Jobkontrolle und kann grundsätzlich auch für Vordergrundjobs verwendet werden (obwohl dies nicht sehr nützlich ist).