Warum „nohup &“ statt „exec &“ verwenden?

Warum „nohup &“ statt „exec &“ verwenden?

Ich weiß, dass nohupes als Binärdatei von jeder Shell aus erreichbar ist. Aber die execintegrierte 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? nohupund execmachen Sie verschiedene Dinge.

execersetzt die Shell durch ein anderes Programm. Die Verwendung execin einem einfachen Hintergrundjob ist nicht sinnvoll: exec myprogram; more stuffersetzt die Shell durch myprogramund wird daher nicht ausgeführt more stuff, im Gegensatz zu myprogram; more stuff, das ausgeführt wird more stuff, wenn myprogrambeendet wird; sondern exec myprogram & more stuffstartet myprogramim Hintergrund und führt dann aus more stuff, genau wie myprogram & more stuff.

nohupfü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 nohupverhindert, 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).

nohupleitet 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 nohupdie 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.

execDer Prozess wird beendet, wenn eine SIGHUPempfangen wird, aber nohupder 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 nohupmit vergleichen exec. Wenn Sie eine ausführbare Datei mit ausführen nohup, wird der Prozess nicht beendet, wenn Sie sich abmelden (SSH-Sitzung); nohupwird normalerweise mit verwendet nice, um Prozesse mit niedrigerer Priorität auszuführen. Das HUPSignal ist per Konvention die Art und Weise, wie ein Terminal abhängige Prozesse vor dem Abmelden warnt.

verwandte Informationen