Wann brauchen Sie 'nohup', wenn Sie bereits mit '&' gegabelt haben?

26

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?

Cedric Martin
quelle
1
Hast du die akzeptierte Antwort und ihren Kommentarthread gelesen? Sie erklären, was nohuptut. Welchen Teil hast du verwirrt?
Gilles 'SO- hör auf böse zu sein'
3
@Gilles: Es mag für Sie offensichtlich sein , weil Sie mit diesen Dingen vertraut sind (Ihren Vertreter gesehen haben) ... Zunächst sagt die akzeptierte Antwort in dem Link, den ich an gegeben habe, jedoch kein Wort über die Verwendung aus sowohl nohup als auch '&' ... Ich bin mir ziemlich sicher, dass meine Frage klar genug und verschieden genug von der anderen ist, und zwei großartige Antworten hier scheinen das zu beweisen; ) Wollen Sie damit wirklich sagen, dass ich mir die Mühe gemacht habe, auf eine andere Frage zu verlinken, ohne die akzeptierte Antwort zu lesen?
Cedric Martin

Antworten:

32

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. cdShell-Funktionen, lösen normalerweise keinen neuen Prozess aus. type cmdIn der Regel erfahren Sie, ob cmdes sich um einen externen Befehl oder eine Shell-Funktion handelt. type typesagt dir, dass es typesich um eine Shell-Funktion handelt.

nohupist etwas anderes. Es weist den neuen Prozess an, zu ignorieren SIGHUP. 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:

  1. run emacs & (sollte standardmäßig in einem separaten X-Fenster ausgeführt werden) .
  2. Führen Sie auf der übergeordneten Shell aus exit.

Sie werden feststellen, dass das emacsFenster getötet wird, obwohl es im Hintergrund ausgeführt wird. Dies ist das Standardverhalten und nohupwird genau verwendet, um dies zu ändern.

Das Ausführen eines Jobs im Hintergrund (mit &oder bg, 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 auf stdin/ stdout) näher erläutern .

In jedem Fall hat dies keinen Einfluss darauf, wie der untergeordnete Prozess reagiert SIGHUP. nohuptut.

rahmu
quelle
+1 an euch beide für die tollen Antworten ... Aber ich bin immer noch verwirrt ... Ich habe das versucht, bevor ich meine Frage beantwortete: Vielleicht ist mein (sehr altes) Debian-Linux-Setup nicht richtig konfiguriert, aber wenn ich "emacs & "und tippe dann" exit ", nur mein xterm wird beendet: emacs bleibt dort.
Cedric Martin
Emacs ist so kompliziert, dass es SIGHUP alleine handhaben kann. Nur standardmäßig werden Prozesse bei SIGHUP beendet. Viele 'Daemon'-Programme wie ntpd oder inetd lesen ihre Konfiguration bei SIGHUP neu, anstatt sie zu beenden. Ich bin selbst ein Vim-Typ, daher habe ich nicht viel Erfahrung mit Emacs.
Bruce Ediger
3
Emacs haben nichts Besonderes. Eine Shell sendet normalerweise SIGHUPan ihre untergeordneten Prozesse, wenn die Shell selbst empfängt SIGHUP, und nicht, wenn die Shell normal beendet wird. Bash hat eine Option huponexit, die es veranlasst, SIGHUPan Kinder zu senden , wenn es beendet wird, aber es ist nicht standardmäßig aktiviert. gnu.org/software/bash/manual/bashref.html#Signals
Keith Thompson
Hallo. zuallererst eine großartige Erklärung. Ich habe versucht, Ihre These zu verifizieren, indem ich einen Prozess mit ausgeführt habe, &und habe meine Shell durch Ausführen geschlossen exit. Der Prozess läuft noch. Irgendwelche Ideen, warum es nicht getötet wurde? Oder fehle ich hier etwas?
Ali Yılmaz
Was ist der Prozess, den Sie ausführen?
Rahmu
16

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 der nohupBefehl SIGHUP auf ignoriert und führt dann den Befehl aus. Dieser neu ausgeführte Befehl behält die Signalmaske dieses nohupSetups 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 nohupBefehl aktivieren, kann dieser ausgeführt werden, nachdem Sie das xterm geschlossen oder sich abgemeldet haben.

Bruce Ediger
quelle
Entschuldigung - du hast mich verloren. Wollen Sie damit sagen, dass mit &with nohupder Befehl in bestimmten Fällen ausgeführt wird, in denen nur using nohupnicht funktioniert? Dies
Mike B
2
@MikeB - Das "&" führt die üblichen Fork / Set-Dinge / Exec-Systemaufrufe aus, um den Befehl "in den Hintergrund" zu stellen. Das heißt, der Befehl, der nicht unterstützt wird, wird asynchron ausgeführt. Das nohupführt einige Aktionen vor dem exec()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 alter nohupBenutzer 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.
Bruce Ediger
-1

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:

  ping google.com > ping_result  &

Ü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 der nohupbefehl.

Ein anderes Szenario ==> wie oben für nohup emac &-> angegeben, emacdas nach dem Abmelden des Systems weiterlaufen sollte, aber nach dem erneuten Anmelden nicht angezeigt wird.

aditya
quelle