Antworten:
Was ist besser, ein Fisch oder ein Fahrrad? nohup
und exec
verschiedene Dinge tun.
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 nicht ausgeführt more stuff
, im Gegensatz zu myprogram; more stuff
der, die more stuff
beim myprogram
Beenden ausgeführt wird. aber exec myprogram & more stuff
fängt myprogram
im hintergrund an und läuft dann more stuff
genauso ab myprogram & more stuff
.
nohup
Führt das angegebene Programm mit ignoriertem SIGHUP-Signal aus. Wenn ein Terminal geschlossen wird, sendet der Kernel SIGHUP an den Steuerungsprozess in diesem Terminal (dh der Shell). Die Shell wiederum sendet SIGHUP an alle Jobs, die im Hintergrund ausgeführt werden. Das Ausführen eines Jobs mit nohup
verhindert, dass er auf diese Weise beendet wird, wenn das Terminal abstürzt (was z. B. der Fall ist, wenn Sie remote angemeldet waren und die Verbindung getrennt wurde oder wenn Sie den Terminalemulator schließen).
nohup
Leitet auch die Ausgabe des Programms in die Datei um nohup.out
. Dies vermeidet, dass das Programm abstirbt, da es nicht in seine Ausgabe oder Fehlerausgabe schreiben kann. Beachten Sie, dass nohup
die Eingabe 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 &
exec firefox
, wird die Shell nicht mehr ausgeführt: Sie wurde durch ersetzt firefox
. Sie können sich vorstellen, dass Sie exec
das Beenden eines Programms mit dem Starten eines neuen Programms kombinieren und dabei dieselbe Prozess-ID beibehalten. Das Terminal läuft weiter, weil es nicht angewiesen wurde anzuhalten. Wenn Sie Firefox später firefox
beenden , wird der Prozess beendet. Das Terminal stellt fest, dass sein untergeordneter Prozess beendet wurde, und beendet sich daher.
exec &
=> führt einen Prozess als Hintergrundprozess aus, sodass Sie dasselbe Terminal für andere Jobs verwenden können.
nohup
=> vermeidet jegliches SIGHUP (Beendigungssignal) und setzt die Ausführung fort, auch wenn Ihr Terminal geschlossen ist.
exec
Prozess stirbt, wenn ein SIGHUP
empfangen wird, aber der nohup
Prozess wird fortgesetzt.
exec
ersetzt normalerweise den laufenden Prozess, aber das scheint nicht zu passieren, wenn Sie &
den Befehl exec'd im Hintergrund ausführen. Weder in bash noch in zsh.
exec smth &
das (exec smth) &
nicht das, was gerade passiert?
(exec smth) &
. Aber ich würde nicht erwarten, dass es dasselbe ist - ich würde erwarten, dass es ein Syntaxfehler ist. Wie können Sie einen Prozess ausführen (indem Sie sich selbst ersetzen) und dann den ausgeführten Prozess im Hintergrund ausführen? Du bist nicht mehr da, um es zu tun.
Der eingebaute Shell-Befehl exec <command>
ersetzt die Shell durch <command>
, es wird kein neuer Prozess und keine neue PID erstellt. Nach Beendigung des <command>
normalen Vorgangs wird Ihr Terminal geschlossen. Durch Ausführen im Hintergrund wird zunächst eine Subshell erstellt, die dann ebenfalls sofort durch ersetzt wird <command>
.
Der nohup <command>
Befehl wird ausgeführt <command>
, bleibt jedoch hängen (kill -s 1), sodass er nicht beendet wird, wenn die Shell, von der aus er gestartet wurde, geschlossen wird. Wenn Sie es zuerst im Hintergrund ausführen, wird eine Subshell erstellt, und der Befehl wird im Hintergrund ausgeführt, sodass Sie zur Eingabeaufforderung zurückkehren.
Beim Skripten ist der unmittelbare Effekt jedoch mehr oder weniger derselbe, er <command>
wird von Ihrem Skript gestartet und das Skript wird fortgesetzt, ohne darauf zu warten, dass <command>
es gestartet, ausgegeben oder abgeschlossen wird.
script.sh &
oder sehen exec script.sh &
. In beiden Fällen wird der Befehl in einem untergeordneten Prozess ausgeführt und ersetzt nicht den aufrufenden Prozess. Siehe paste.alacon.org/44474 (zu lang, um ihn hier in einem Kommentar zu kopieren ...). Was mache ich falsch?
Sie können nicht vergleichen nohup
mit exec
. Wenn Sie eine ausführbare Datei mit ausführen nohup
, wird der Prozess beim Abmelden (ssh-Sitzung) nicht abgebrochen. wird normalerweise nohup
verwendet nice
, um Prozesse mit einer niedrigeren Priorität auszuführen. Das HUP
Signal ist gemäß Konvention die Art und Weise, wie ein Terminal abhängige Abmeldeprozesse warnt