Erstens ist diese Frage verwandt, aber definitiv nicht mit dieser sehr schönen Frage identisch:
Unterschied zwischen nohup, disown und &
Ich möchte etwas verstehen: Wenn ich '&' mache, habe ich recht?
Ist es jemals sinnvoll "nohup ... &" zu machen oder ist einfach & ausreichend?
Könnte jemand einen Fall anzeigen, in dem Sie "&" verwenden und trotzdem "nohup" verwenden möchten?
nohup
tut. Welchen Teil hast du verwirrt?Antworten:
Zuallererst wird jedes Mal, wenn Sie einen Befehl ausführen, ein neuer Prozess ausgelöst, unabhängig davon, ob Sie ihn ausführen
&
oder nicht.&
bedeutet nur, dass Sie es im Hintergrund ausführen.Beachten Sie, dass dies nicht sehr genau ist. Einige Befehle, wie z. B.
cd
Shell-Funktionen, lösen normalerweise keinen neuen Prozess aus.type cmd
In der Regel erfahren Sie, obcmd
es sich um einen externen Befehl oder eine Shell-Funktion handelt.type type
sagt dir, dass estype
sich um eine Shell-Funktion handelt.nohup
ist etwas anderes. Es weist den neuen Prozess an, zu ignorierenSIGHUP
. Dies ist das Signal, das vom Kernel gesendet wird, wenn die übergeordnete Shell geschlossen wird.Um Ihre Frage zu beantworten, gehen Sie wie folgt vor:
emacs &
(sollte standardmäßig in einem separaten X-Fenster ausgeführt werden) .exit
.Sie werden feststellen, dass das
emacs
Fenster getötet wird, obwohl es im Hintergrund ausgeführt wird. Dies ist das Standardverhalten undnohup
wird genau verwendet, um dies zu ändern.Das Ausführen eines Jobs im Hintergrund (mit
&
oderbg
, ich wette, andere Shells haben auch andere Syntaxen) ist eine Shell-Funktion, die sich aus der Multitasking-Fähigkeit moderner Systeme ergibt. Anstatt eine neue Shell - Instanz für jedes Programm von Forking Sie starten möchten, moderne Schalen (bash
,zsh
,ksh
, ...) haben die Möglichkeit , eine Liste von Programmen (oder zu verwalten Jobs ). Es kann immer nur einer von ihnen im Vordergrund sein , was bedeutet, dass er den Shell-Fokus erhält. Ich wünschte, jemand könnte die Unterschiede zwischen einem Prozess im Vordergrund und einem im Hintergrund (der Hauptzugriff aufstdin
/stdout
) näher erläutern .In jedem Fall hat dies keinen Einfluss darauf, wie der untergeordnete Prozess reagiert
SIGHUP
.nohup
tut.quelle
SIGHUP
an ihre untergeordneten Prozesse, wenn die Shell selbst empfängtSIGHUP
, und nicht, wenn die Shell normal beendet wird. Bash hat eine Optionhuponexit
, die es veranlasst,SIGHUP
an Kinder zu senden , wenn es beendet wird, aber es ist nicht standardmäßig aktiviert. gnu.org/software/bash/manual/bashref.html#Signals&
und habe meine Shell durch Ausführen geschlossenexit
. Der Prozess läuft noch. Irgendwelche Ideen, warum es nicht getötet wurde? Oder fehle ich hier etwas?Ist es jemals nützlich zu tun
nohup ... &
? Ja. Wenn Sie einen Prozess nur "im Hintergrund" mit starten&
, ist dieser neue Prozess immer noch Mitglied in der "Prozessgruppe" der ursprünglichen Shell. Wenn diese Shell oder die Prozessgruppe bestimmte Signale empfängt (z. B. SIGHUP), werden sie standardmäßig beendet. Das heißt, wenn Sie einen Prozess mit&
einer Shell ausführen, die von einem xterm oder rxvt oder einem anderen Fenster-Terminal-Emulator gestartet wurde, erhält der Hintergrundprozess beim Schließen des Fensters ein SIGHUP. Der meiste beiläufig geschriebene Code verarbeitet SIGHUP nicht und wird daher beendet.Wenn Sie dies tun
nohup ... &
, setzt dernohup
Befehl SIGHUP auf ignoriert und führt dann den Befehl aus. Dieser neu ausgeführte Befehl behält die Signalmaske diesesnohup
Setups bei, es sei denn, der Befehl führt selbst eine Signalverarbeitung durch. Wenn Sie xterm oder rxvt oder was auch immer schließen, liefert der Kernel SIGHUP an den Befehlsprozess, der ignoriert wird. Es läuft weiter.Wenn Sie einen
nohup
Befehl aktivieren, kann dieser ausgeführt werden, nachdem Sie das xterm geschlossen oder sich abgemeldet haben.quelle
&
withnohup
der Befehl in bestimmten Fällen ausgeführt wird, in denen nur usingnohup
nicht funktioniert? Diesnohup
führt einige Aktionen vor demexec()
Systemaufruf aus, damit der Fork-Prozess bestimmte Signale ignoriert. Ja, ein "&" ermöglicht die Ausführung eines Befehls unter bestimmten Umständen, die ein einfacher alternohup
Benutzer nicht ausführen würde. Zum Beispiel das xterm schließen, das der Shell zugeordnet ist, die das nohup ausgeführt hat, oder sich abmelden.Wenn Sie ein Programm im Hintergrund (mit & als Suffix) auf einem Linux-Betriebssystem ausführen und sich auch danach abmelden, läuft es weiter: Probieren Sie Folgendes aus:
Überprüfen Sie nach dem Zurückmelden die Anzahl der Zeilen in der Ausgabedatei
ping_result
, die weiter zunehmen. Dies bedeutet, dass die Datei noch ausgeführt wird. Es wurde jedoch mitgeteilt, dass sie geschlossen wird. dann was nützt dernohup
befehl.Ein anderes Szenario ==> wie oben für
nohup emac &
-> angegeben,emac
das nach dem Abmelden des Systems weiterlaufen sollte, aber nach dem erneuten Anmelden nicht angezeigt wird.quelle