Was ist die Funktion des Befehls nohup?

18

Ich bin ein Neuling in Ubuntu. Ich habe einen Befehl gelernt

nohup [command]- <command>Immun gegen Auflegen

Ich kann die Bedeutung von " Immun gegen Auflegen " nicht verstehen . Um welche Art von Signal handelt es sich? Und bitte erklären Sie mir, wie dieser Befehl mit einem Beispiel verwendet wird.

coding_ninza
quelle
Wenn in Ihrer Shell verfügbar, disownist eine bessere Alternative zu nohup. Hintergrund einen Befehl mit command &oder Ctrl-Z, dann verwenden Sie disown, um es von der Shell zu trennen.
John Kugelman unterstützt Monica am
@JohnKugelman das reicht nicht , du hast auch die eingabe , die ausgabe und den fehlerstrom umgeleitet . Warum also nicht 'nohup' verwenden, das dies automatisch für Sie erledigt?
miracle173

Antworten:

34

Angenommen, Sie haben einen geditTexteditor in einem Terminal geöffnet und arbeiten daran. Wenn Sie das Terminal vor dem Schließen schließen gedit, wird der gedit ebenfalls geschlossen, sobald Sie das Terminal schließen. Also, was ist hier los? Das geditläuft als Child-Prozess unter dem Terminal. Wenn Sie das Terminal schließen, wird ein Auflegesignal ( SIGHUP) an den Prozess gesendet, der den untergeordneten Prozess beendet.

Wenn Sie andererseits möchten gedit, dass Ihr untergeordneter Prozess (hier ) auch nach dem Schließen des übergeordneten Terminals weiter ausgeführt wird, möchten Sie, dass Ihr Prozess gegen das Auflegen-Signal immun ist. Wenn Sie das Terminal schließen, wird der untergeordnete Prozess nicht geschlossen. nohupmacht genau diesen Job.

nohupTrennt einen Befehl nicht vom Terminal , lässt Ihr Skript SIGHUP ignorieren und leitet stdout / stderr in eine Datei nohup.out um, sodass der Befehl nach dem Abmelden im Hintergrund weiter ausgeführt werden kann. Wenn Sie die Shell / das Terminal schließen oder sich abmelden, ist Ihr Befehl kein untergeordnetes Element dieser Shell mehr. Es gehört zum init-Prozess. Wenn Sie in suchen pstree, sehen Sie, dass es jetzt Prozess 1 (init) gehört. Das kann nicht wieder in den Vordergrund gebracht werden, da der Vordergrund nicht mehr existiert.

souravc
quelle
16

Abgesehen von dem, was @sourvac geschrieben hat, ist dies ein Erbe von Back In The Day, als sich Leute über reine Textterminals angemeldet haben, oft über das (originale, analoge 110-Baud) Modem: Das "Auflegen" bedeutet buchstäblich "Auflegen" ".

Eine PID, die gegen Auflegen immun ist, läuft auch dann weiter, wenn Sie sich abmelden und den Hörer auflegen . Dies war auf langsamen Computern sehr nützlich, wenn Jobs stundenlang ausgeführt wurden und Sie nicht einfach eingeloggt bleiben konnten (jemand anderes musste das Terminal benutzen, Sie mussten das Telefon benutzen, statisch in der Leitung konnte die Verbindung "bzzt" sein , etc).

RonJohn
quelle
1
Nicht nur früher. Ich führe die meisten meiner großen Jobs auf einem Server-Cluster aus, in dem ich ssh ausführe. Wenn ich nohup nicht verwenden würde, müsste ich meinen Laptop tagelang mit diesen Computern verbunden lassen, während ich auf die Beendigung der Jobs warte.
Ray
@ Ray, was ist damit, sie über "at" oder als Cron-Jobs auszuführen?
RonJohn
@ RonJohn Sicher. Oder über eine Grid Engine. Ich wollte nicht vorschlagen, dass Nohup die einzige Option ist, nur dass es heute noch für diesen Zweck verwendet wird.
Ray
1
Vielleicht sind Ihre historischen Bemerkungen richtig. Aber Ihre Schlussfolgerungen über die gegenwärtige Bedeutung sind falsch. Dies ist auf langsamen Computern nicht hilfreich, aber für Jobs mit langer Laufzeit. Das sind zwei verschiedene Dinge. Sie verwenden "nohup", um Ihren Job vor dem beabsichtigten oder unbeabsichtigten Trennen Ihres Terminals zu schützen. Selbst heutzutage sind Sie nicht glücklich, wenn ein Auftrag abgebrochen wird, weil ein Netzwerkfehler Ihr Terminal trennt und Ihr Auftrag abgebrochen wird.
miracle173
@ Ray Cron-Jobs sind völlig ungeeignet, um dies zu erreichen. Cronjobs sind für periodische Aufgaben gedacht, man muss die Umgebung im Cronjob einstellen und viele andere Dinge berücksichtigen. Vielleicht ist 'at' ein bisschen einfacher zu handhaben, aber dennoch komplexer als nohup.
miracle173