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.


6
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.


7

Korrigiere mich, wenn ich falsch liege

  nohup myprocess.out &

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.


2

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.


0

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.