Ich weiß, dass nohup
es als Binärdatei von jeder Shell aus erreichbar ist. Aber das exec
eingebaute existiert wahrscheinlich in jeder Shell.
Gibt es einen Grund, den einen dem anderen vorzuziehen?
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 ersetztfirefox
. Sie können sich vorstellen, dass Sieexec
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äterfirefox
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 einSIGHUP
empfangen wird, aber dernohup
Prozess wird fortgesetzt.quelle
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.quelle
script.sh &
oder sehenexec 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
mitexec
. Wenn Sie eine ausführbare Datei mit ausführennohup
, wird der Prozess beim Abmelden (ssh-Sitzung) nicht abgebrochen. wird normalerweisenohup
verwendetnice
, um Prozesse mit einer niedrigeren Priorität auszuführen. DasHUP
Signal ist gemäß Konvention die Art und Weise, wie ein Terminal abhängige Abmeldeprozesse warntquelle