Was ist der Unterschied zwischen nohup und kaufmännischem Und?
242
Beides nohup myprocess.out &oder myprocess.out &setze myprocess.out so, dass es im Hintergrund ausgeführt wird. Nachdem ich das Terminal heruntergefahren habe, läuft der Prozess noch. Was ist der Unterschied zwischen ihnen?
Welche Shell benutzt du? Das Verhalten variiert zwischen den Muscheln
shx2
1
Bash. Und ich weiß warum jetzt laut @nemos Antwort.
Yarkee
@Yarkee Wenn die Antwort zu Ihrem Problem passt, markieren Sie die Frage als akzeptiert (das Kontrollkästchen unter den Stimmen der Antwort), damit sie nicht unbeantwortet bleibt. Sie sollten dies für alle Ihre Fragen tun :)
Nemo
1
shutdownsollte als Begriff mit einer bestimmten Linux-Bedeutung vermieden und durch ersetzt werden exit.
Patrizio Bertoni
Antworten:
316
nohupfängt das Auflegesignal ab (siehe man 7 signal), während das kaufmännische Und dies nicht tut (außer dass die Shell auf diese Weise konfiguriert ist oder überhaupt nicht sendet SIGHUP).
Wenn Sie einen Befehl mit &der Shell ausführen und anschließend beenden, beendet die Shell normalerweise den Unterbefehl mit dem Hangup-Signal ( kill -SIGHUP <pid>). Dies kann verhindert werden nohup, da es das Signal auffängt und ignoriert, so dass es nie die tatsächliche Anwendung erreicht.
Wenn Sie bash verwenden, können Sie mit dem Befehl shopt | grep huponherausfinden, ob Ihre Shell SIGHUP an ihre untergeordneten Prozesse sendet oder nicht. Wenn es ausgeschaltet ist, werden Prozesse nicht beendet, wie es für Sie der Fall zu sein scheint. Weitere Informationen darüber, wie Bash Anwendungen beendet, finden Sie hier .
Es gibt Fälle, in denen nohupdies nicht funktioniert, z. B. wenn der von Ihnen gestartete Prozess das SIGHUPSignal erneut verbindet, wie dies hier der Fall ist .
Es kann erwähnenswert sein, dass &der Unterbefehl nur dazu führt , dass einige Signale (z. B. SIGINT) nicht empfangen werden. nohupfügt SIGHUPim Wesentlichen der Liste der Signale hinzu, die nicht weitergegeben werden.
Studgeek
46
myprocess.out &würde den Prozess im Hintergrund mit einer Subshell ausführen. Wenn die aktuelle Shell beendet wird (z. B. durch Abmelden), werden auch alle Subshells beendet, sodass auch der Hintergrundprozess beendet wird. Der Befehl nohup ignoriert das HUPSignal und somit selbst dann, wenn die aktuelle Shell beendet wird, die Subshell und myprocess.outwürde weiterhin im Hintergrund ausgeführt. Ein weiterer Unterschied besteht darin, dass &allein stdout / stderr nicht umgeleitet wird. Wenn also eine Ausgabe oder ein Fehler vorliegt, werden diese auf dem Terminal angezeigt. nohup hingegen leite den stdout / stderr nach nohup.outoder um $HOME/nohup.out.
Ich renne myprocess.out &und verlasse die Shell. Wenn ich es jedoch ps aux | grep myprocess.outin einer anderen Shell verwende, kann ich immer noch "myprocess.out" finden. Dies bedeutet, dass der Prozess noch ausgeführt wird und nicht beendet werden kann.
Yarkee
1
@amit_g Wenn die übergeordnete Shell mit beendet wird, kill -9gibt es kein SIGHUP, da die übergeordnete Shell SIGKILL verarbeiten muss, was nicht möglich ist.
Nemo
2
Überprüfen Sie shopt | grep hupon wie in der anderen antwort erwähnt.
amit_g
31
Meistens melden wir uns mit ssh beim Remote-Server an. Wenn Sie ein Shell-Skript starten und sich abmelden, wird der Prozess abgebrochen. Nohup hilft dabei, das Skript auch nach dem Abmelden von der Shell im Hintergrund auszuführen.
Nohup command name &
eg: nohup sh script.sh &
Nohup fängt die HUP-Signale ab. Nohup stellt den Job nicht automatisch in den Hintergrund. Wir müssen das explizit mit & erklären
Vielen Dank. Ich habe Ihre Antwort nicht erwartet, aber die Tatsache, dass sie hier ist, ist großartig. Es beantwortet die Frage, die ich nicht gestellt habe: D
Vaibhav Kaushal
26
Wenn Sie das kaufmännische Und (&) verwenden, wird der Befehl in einem untergeordneten Prozess ausgeführt (untergeordnet zur aktuellen Bash-Sitzung). Wenn Sie die Sitzung beenden, werden jedoch alle untergeordneten Prozesse beendet.
Die Verwendung von nohup + kaufmännisches Und (&) bewirkt dasselbe, außer dass am Ende der Sitzung das übergeordnete Element des untergeordneten Prozesses in "1" geändert wird. Dies ist der "init" -Prozess, wodurch verhindert wird, dass das untergeordnete Element getötet wird.
nohup fängt das Hangup-Signal ab, was bedeutet, dass es einen Prozess sendet, wenn das Terminal geschlossen wird.
myprocess.out &
Der Prozess kann ausgeführt werden, wird jedoch gestoppt, sobald das Terminal geschlossen wird.
nohup myprocess.out
Prozess kann sogar Terminal geschlossen ausführen, aber Sie können den Prozess stoppen, indem Sie ctrl+ zim Terminal drücken . Crt+ zfunktioniert nicht wenn &vorhanden.
Der Befehl nohup ist ein Dienstprogramm zur Signalmaskierung und fängt das Auflegesignal ab. Wo als kaufmännisches Und nicht die Auflegsignale auffängt. Die Shell beendet den Unterbefehl mit dem Auflegen-Signal, wenn ein Befehl mit & ausgeführt und die Shell beendet wird. Dies kann durch Verwendung von nohup verhindert werden, da es das Signal abfängt. Der Nohup-Befehl akzeptiert ein Auflegesignal, das vom Kernel an einen Prozess gesendet werden kann, und blockiert sie. Der Befehl Nohup ist hilfreich, wenn ein Benutzer eine lange laufende Anwendungsabmeldung starten oder das Fenster schließen möchte, in dem der Prozess initiiert wurde. Bei beiden Aktionen wird der Kernel normalerweise aufgefordert, die Anwendung zu beenden. Mit einem Nohup-Wrapper kann der Vorgang jedoch fortgesetzt werden. Wenn Sie das kaufmännische Und verwenden, wird der Befehl in einem untergeordneten Prozess und diesem untergeordneten Element der aktuellen Bash-Sitzung ausgeführt. Wenn Sie die Sitzung beenden, Alle untergeordneten Prozesse dieses Prozesses werden beendet. Das kaufmännische Und bezieht sich auf die Jobsteuerung für die aktive Shell. Dies ist nützlich, um einen Prozess in einer Sitzung im Hintergrund auszuführen.
Es gibt viele Fälle, in denen kleine Unterschiede zwischen Umgebungen Sie beißen können. Dies ist eine, auf die ich kürzlich gestoßen bin. Was ist der Unterschied zwischen diesen beiden Befehlen?
1~ $ nohup myprocess.out &2~ $ myprocess.out &
Die Antwort ist die gleiche wie gewöhnlich - es kommt darauf an.
nohup fängt das Auflegesignal ab, das kaufmännische Und nicht.
Was ist das Auflegesignal?
SIGHUP - Auflegen am aufsteigenden Terminal oder Tod des Steuerprozesses (Wert: 1).
Wenn Sie einen Befehl mit & ausführen und anschließend die Shell beenden, beendet die Shell normalerweise den Unterbefehl mit dem Hangup-Signal (wie kill -SIGHUP $ PID). Dies kann mit nohup verhindert werden, da das Signal abgefangen und ignoriert wird, sodass es nie die eigentliche Anwendung erreicht.
Gut, aber wie in diesem Fall gibt es immer "Aber". Es gibt keinen Unterschied zwischen diesen Startmethoden, wenn die Shell so konfiguriert ist, dass sie überhaupt kein SIGHUP sendet.
Wenn Sie bash verwenden, können Sie mit dem unten angegebenen Befehl herausfinden, ob Ihre Shell SIGHUP an ihre untergeordneten Prozesse sendet oder nicht:
~ $ shopt | grep hupon
Und außerdem gibt es Fälle, in denen nohup nicht funktioniert. Wenn der von Ihnen gestartete Prozess beispielsweise das NOHUP-Signal erneut verbindet (dies erfolgt im Inneren auf der Ebene des Anwendungscodes).
In dem beschriebenen Fall hat mich das Fehlen von Unterschieden gebissen, als in einem Skript zum Starten eines benutzerdefinierten Dienstes ein zweites Skript aufgerufen wurde, das die richtige Anwendung ohne den Befehl nohup einrichtet und startet.
In einer Linux-Umgebung funktionierte alles reibungslos, in einer zweiten wurde die Anwendung beendet, sobald das zweite Skript beendet wurde (das Erkennen dieses Falls hat natürlich viel mehr Zeit in Anspruch genommen, als Sie vielleicht denken: stecken_out_tongue :).
Nach dem Hinzufügen von nohup als Startmethode zum zweiten Skript wird die Anwendung auch dann ausgeführt, wenn die Skripte beendet werden und dieses Verhalten in beiden Umgebungen konsistent wird.
shutdown
sollte als Begriff mit einer bestimmten Linux-Bedeutung vermieden und durch ersetzt werdenexit
.Antworten:
nohup
fängt das Auflegesignal ab (sieheman 7 signal
), während das kaufmännische Und dies nicht tut (außer dass die Shell auf diese Weise konfiguriert ist oder überhaupt nicht sendetSIGHUP
).Wenn Sie einen Befehl mit
&
der Shell ausführen und anschließend beenden, beendet die Shell normalerweise den Unterbefehl mit dem Hangup-Signal (kill -SIGHUP <pid>
). Dies kann verhindert werdennohup
, da es das Signal auffängt und ignoriert, so dass es nie die tatsächliche Anwendung erreicht.Wenn Sie bash verwenden, können Sie mit dem Befehl
shopt | grep hupon
herausfinden, ob Ihre Shell SIGHUP an ihre untergeordneten Prozesse sendet oder nicht. Wenn es ausgeschaltet ist, werden Prozesse nicht beendet, wie es für Sie der Fall zu sein scheint. Weitere Informationen darüber, wie Bash Anwendungen beendet, finden Sie hier .Es gibt Fälle, in denen
nohup
dies nicht funktioniert, z. B. wenn der von Ihnen gestartete Prozess dasSIGHUP
Signal erneut verbindet, wie dies hier der Fall ist .quelle
&
der Unterbefehl nur dazu führt , dass einige Signale (z. B. SIGINT) nicht empfangen werden.nohup
fügtSIGHUP
im Wesentlichen der Liste der Signale hinzu, die nicht weitergegeben werden.myprocess.out &
würde den Prozess im Hintergrund mit einer Subshell ausführen. Wenn die aktuelle Shell beendet wird (z. B. durch Abmelden), werden auch alle Subshells beendet, sodass auch der Hintergrundprozess beendet wird. Der Befehl nohup ignoriert dasHUP
Signal und somit selbst dann, wenn die aktuelle Shell beendet wird, die Subshell undmyprocess.out
würde weiterhin im Hintergrund ausgeführt. Ein weiterer Unterschied besteht darin, dass&
allein stdout / stderr nicht umgeleitet wird. Wenn also eine Ausgabe oder ein Fehler vorliegt, werden diese auf dem Terminal angezeigt. nohup hingegen leite den stdout / stderr nachnohup.out
oder um$HOME/nohup.out
.quelle
myprocess.out &
und verlasse die Shell. Wenn ich es jedochps aux | grep myprocess.out
in einer anderen Shell verwende, kann ich immer noch "myprocess.out" finden. Dies bedeutet, dass der Prozess noch ausgeführt wird und nicht beendet werden kann.kill -9
gibt es kein SIGHUP, da die übergeordnete Shell SIGKILL verarbeiten muss, was nicht möglich ist.Meistens melden wir uns mit ssh beim Remote-Server an. Wenn Sie ein Shell-Skript starten und sich abmelden, wird der Prozess abgebrochen. Nohup hilft dabei, das Skript auch nach dem Abmelden von der Shell im Hintergrund auszuführen.
Nohup fängt die HUP-Signale ab. Nohup stellt den Job nicht automatisch in den Hintergrund. Wir müssen das explizit mit & erklären
quelle
Wenn Sie das kaufmännische Und (&) verwenden, wird der Befehl in einem untergeordneten Prozess ausgeführt (untergeordnet zur aktuellen Bash-Sitzung). Wenn Sie die Sitzung beenden, werden jedoch alle untergeordneten Prozesse beendet.
Die Verwendung von nohup + kaufmännisches Und (&) bewirkt dasselbe, außer dass am Ende der Sitzung das übergeordnete Element des untergeordneten Prozesses in "1" geändert wird. Dies ist der "init" -Prozess, wodurch verhindert wird, dass das untergeordnete Element getötet wird.
quelle
Korrigiere mich, wenn ich falsch liege
nohup fängt das Hangup-Signal ab, was bedeutet, dass es einen Prozess sendet, wenn das Terminal geschlossen wird.
Der Prozess kann ausgeführt werden, wird jedoch gestoppt, sobald das Terminal geschlossen wird.
Prozess kann sogar Terminal geschlossen ausführen, aber Sie können den Prozess stoppen, indem Sie
ctrl
+z
im Terminal drücken .Crt
+z
funktioniert nicht wenn&
vorhanden.quelle
Der Befehl nohup ist ein Dienstprogramm zur Signalmaskierung und fängt das Auflegesignal ab. Wo als kaufmännisches Und nicht die Auflegsignale auffängt. Die Shell beendet den Unterbefehl mit dem Auflegen-Signal, wenn ein Befehl mit & ausgeführt und die Shell beendet wird. Dies kann durch Verwendung von nohup verhindert werden, da es das Signal abfängt. Der Nohup-Befehl akzeptiert ein Auflegesignal, das vom Kernel an einen Prozess gesendet werden kann, und blockiert sie. Der Befehl Nohup ist hilfreich, wenn ein Benutzer eine lange laufende Anwendungsabmeldung starten oder das Fenster schließen möchte, in dem der Prozess initiiert wurde. Bei beiden Aktionen wird der Kernel normalerweise aufgefordert, die Anwendung zu beenden. Mit einem Nohup-Wrapper kann der Vorgang jedoch fortgesetzt werden. Wenn Sie das kaufmännische Und verwenden, wird der Befehl in einem untergeordneten Prozess und diesem untergeordneten Element der aktuellen Bash-Sitzung ausgeführt. Wenn Sie die Sitzung beenden, Alle untergeordneten Prozesse dieses Prozesses werden beendet. Das kaufmännische Und bezieht sich auf die Jobsteuerung für die aktive Shell. Dies ist nützlich, um einen Prozess in einer Sitzung im Hintergrund auszuführen.
quelle
Es gibt viele Fälle, in denen kleine Unterschiede zwischen Umgebungen Sie beißen können. Dies ist eine, auf die ich kürzlich gestoßen bin. Was ist der Unterschied zwischen diesen beiden Befehlen?
Die Antwort ist die gleiche wie gewöhnlich - es kommt darauf an.
nohup fängt das Auflegesignal ab, das kaufmännische Und nicht.
Was ist das Auflegesignal?
SIGHUP - Auflegen am aufsteigenden Terminal oder Tod des Steuerprozesses (Wert: 1).
Wenn Sie einen Befehl mit & ausführen und anschließend die Shell beenden, beendet die Shell normalerweise den Unterbefehl mit dem Hangup-Signal (wie kill -SIGHUP $ PID). Dies kann mit nohup verhindert werden, da das Signal abgefangen und ignoriert wird, sodass es nie die eigentliche Anwendung erreicht.
Gut, aber wie in diesem Fall gibt es immer "Aber". Es gibt keinen Unterschied zwischen diesen Startmethoden, wenn die Shell so konfiguriert ist, dass sie überhaupt kein SIGHUP sendet.
Wenn Sie bash verwenden, können Sie mit dem unten angegebenen Befehl herausfinden, ob Ihre Shell SIGHUP an ihre untergeordneten Prozesse sendet oder nicht:
Und außerdem gibt es Fälle, in denen nohup nicht funktioniert. Wenn der von Ihnen gestartete Prozess beispielsweise das NOHUP-Signal erneut verbindet (dies erfolgt im Inneren auf der Ebene des Anwendungscodes).
In dem beschriebenen Fall hat mich das Fehlen von Unterschieden gebissen, als in einem Skript zum Starten eines benutzerdefinierten Dienstes ein zweites Skript aufgerufen wurde, das die richtige Anwendung ohne den Befehl nohup einrichtet und startet.
In einer Linux-Umgebung funktionierte alles reibungslos, in einer zweiten wurde die Anwendung beendet, sobald das zweite Skript beendet wurde (das Erkennen dieses Falls hat natürlich viel mehr Zeit in Anspruch genommen, als Sie vielleicht denken: stecken_out_tongue :).
Nach dem Hinzufügen von nohup als Startmethode zum zweiten Skript wird die Anwendung auch dann ausgeführt, wenn die Skripte beendet werden und dieses Verhalten in beiden Umgebungen konsistent wird.
quelle