Ich weiß, dass nohup
es als Binärdatei von jeder Shell aus erreichbar ist. Aber die exec
integrierte Funktion ist wahrscheinlich in jeder Shell vorhanden.
Gibt es einen Grund, einen von beiden dem anderen vorzuziehen?
Antwort1
Was ist besser, ein Fisch oder ein Fahrrad? nohup
und exec
machen Sie verschiedene Dinge.
exec
ersetzt die Shell durch ein anderes Programm. Die Verwendung exec
in einem einfachen Hintergrundjob ist nicht sinnvoll: exec myprogram; more stuff
ersetzt die Shell durch myprogram
und wird daher nicht ausgeführt more stuff
, im Gegensatz zu myprogram; more stuff
, das ausgeführt wird more stuff
, wenn myprogram
beendet wird; sondern exec myprogram & more stuff
startet myprogram
im Hintergrund und führt dann aus more stuff
, genau wie myprogram & more stuff
.
nohup
führt das angegebene Programm aus, wobei das SIGHUP-Signal ignoriert wird. Wenn ein Terminal geschlossen wird, sendet der Kernel ein SIGHUP an den Steuerungsprozess in diesem Terminal (also die Shell). Die Shell sendet wiederum ein SIGHUP an alle im Hintergrund laufenden Jobs. Das Ausführen eines Jobs mit nohup
verhindert, dass dieser auf diese Weise beendet wird, wenn das Terminal abstürzt (was z. B. passiert, wenn Sie remote angemeldet waren und die Verbindung abbricht oder wenn Sie Ihren Terminalemulator schließen).
nohup
leitet auch die Ausgabe des Programms in die Datei um nohup.out
. Dadurch wird verhindert, dass das Programm abstürzt, weil es nicht in der Lage ist, in seine Ausgabe oder Fehlerausgabe zu schreiben. Beachten Sie, dass nohup
die Eingabe dadurch nicht umgeleitet wird. Um ein Programm vollständig von dem Terminal zu trennen, auf dem Sie es gestartet haben, verwenden Sie
nohup myprogram </dev/null >myprogram.log 2>&1 &
Antwort2
exec &
=> führt einen Prozess als Hintergrundprozess aus, sodass Sie dasselbe Terminal weiterhin für andere Aufgaben verwenden können.
nohup
=> vermeidet alle SIGHUPs (Beendigungssignale) und setzt die Ausführung fort, auch wenn Ihr Terminal geschlossen ist.
exec
Der Prozess wird beendet, wenn eine SIGHUP
empfangen wird, aber nohup
der Prozess wird fortgesetzt.
Antwort3
Der in die Shell integrierte Befehl exec <command>
ersetzt die Shell durch <command>
, es wird kein neuer Prozess und keine neue PID erstellt. Nach Abschluss von <command>
wird Ihr Terminal normalerweise geschlossen. Durch die Ausführung im Hintergrund wird zunächst eine Subshell erstellt, die dann ebenfalls sofort durch ersetzt wird <command>
.
Der nohup <command>
Befehl wird ausgeführt <command>
, ist aber immun gegen Abstürze (kill -s 1), sodass er nicht beendet wird, wenn die Shell, das Terminal, von dem aus er gestartet wurde, geschlossen wird. Wenn Sie ihn im Hintergrund ausführen, wird zuerst eine Subshell erstellt und der Befehl wird im Hintergrund ausgeführt, wodurch Sie zur Eingabeaufforderung zurückkehren.
Beim Skripting ist die unmittelbare Auswirkung jedoch mehr oder weniger dieselbe: <command>
Es wird von Ihrem Skript gestartet und das Skript wird fortgesetzt, ohne darauf zu warten, dass <command>
es gestartet wird, eine Ausgabe gesendet wird oder abgeschlossen wird.
Antwort4
Sie können nicht nohup
mit vergleichen exec
. Wenn Sie eine ausführbare Datei mit ausführen nohup
, wird der Prozess nicht beendet, wenn Sie sich abmelden (SSH-Sitzung); nohup
wird normalerweise mit verwendet nice
, um Prozesse mit niedrigerer Priorität auszuführen. Das HUP
Signal ist per Konvention die Art und Weise, wie ein Terminal abhängige Prozesse vor dem Abmelden warnt.