Wenn ich einen Hintergrundprozess starte und mich dann abmelde, läuft er dann weiter?

29

Wenn ich dies nach einem längeren Gespräch mit einem Kollegen frage, möchte ich hier wirklich eine Klarstellung.

Ich starte einen Hintergrundprozess, indem ich entweder " &" an die Befehlszeile anhänge oder indem ich CTRL-Zihn mit " bg" stoppe und im Hintergrund mit " " wieder aufnehme. Dann melde ich mich ab.

Was geschieht?

Wir waren uns ziemlich sicher, dass es von einem SIGHUP hätte getötet werden sollen, aber das ist nicht geschehen; Beim erneuten Anmelden lief der Prozess problemlos und pstreezeigte, dass er von "übernommen" wurde init.

Ist das das erwartete Verhalten?

Aber wenn ja, wozu dient der nohupBefehl? Es sieht so aus, als würde der Prozess sowieso nicht beendet werden, mit oder ohne ...


Bearbeiten 1

Einige weitere Details:

  • Der Befehl wurde über eine SSH-Sitzung und nicht über die physische Konsole gestartet.
  • Der Befehl wurde ohne nohup und / oder gestartet &. es wurde dann mit suspendiert CTRL-Zund im Hintergrund mit wieder aufgenommen bg.
  • Die SSH-Sitzung wurde nicht abgebrochen. Es gab eine tatsächliche Abmeldung (" exit" Befehl).
  • Der Vorgang war ein scpDateikopiervorgang.
  • Beim erneuten Anmelden wurde angezeigt, pstreedass der Prozess ausgeführt wird und untergeordnet ist von init.

Bearbeiten 2

Um die Frage klarer zu formulieren: Wird ein Prozess, der in den Hintergrund gestellt wird (mit &oder bg) SIGHUP, genauso ignoriert wie der nohupBefehl?


Bearbeiten 3

Ich habe versucht, manuell ein an SIGHUPzu senden scp: es wurde beendet, sodass das Signal definitiv nicht ignoriert wird.

Dann habe ich versucht, es erneut zu starten, in den Hintergrund zu stellen und mich abzumelden: Es wurde von "adoptiert" initund lief weiter, und ich fand es dort, als ich mich wieder anmeldete.

Ich bin jetzt ziemlich verwirrt. Es sieht so aus, SIGHUPals ob beim Abmelden überhaupt kein gesendet wurde.

Massimo
quelle
Ich habe dort keine Erwähnung von Konsolen-E / A gesehen, was ebenfalls zu einem Stolpern führen wird. Hast du Dinge 1>/dev/null 2>&1umgeleitet, zB für Bash, etc.?
Avery Payne
Nein, habe ich nicht. SCP benötigte natürlich keine Standardeingabe ... und die Standardausgabe schien kein Problem zu sein.
Massimo
Ob Ihre Shell als Anmeldeshell ausgeführt wird oder nicht, ändert die Leistung. Dies kann hier der Fall sein.
Warner
Einige andere Tests gemacht; Ich habe es hier zusammengefasst: serverfault.com/questions/117152 .
Massimo

Antworten:

20

Antwort gefunden.

Für BASH hängt dies von der huponexitShell-Option ab, die mit dem integrierten shoptBefehl angezeigt und / oder festgelegt werden kann .

Diese Option ist anscheinend standardmäßig deaktiviert, zumindest auf RedHat-basierten Systemen.

Mehr Infos auf der BASH-Manpage :

Die Shell wird standardmäßig nach Erhalt eines SIGHUP beendet. Vor dem Beenden sendet eine interaktive Shell das SIGHUP erneut an alle laufenden oder gestoppten Jobs. Gestoppte Jobs werden an SIGCONT gesendet, um sicherzustellen, dass sie den SIGHUP erhalten. Um zu verhindern, dass die Shell das Signal an einen bestimmten Job sendet, sollte sie mit dem verbotenen eingebauten Befehl (siehe BEFEHLE ZUM VERBAUEN DER SHELL) aus der Jobtabelle entfernt oder mit dem Befehl -h markiert werden, um SIGHUP nicht zu empfangen.

Wenn die Shell-Option huponexit mit shopt festgelegt wurde, sendet bash beim Beenden einer interaktiven Anmeldeshell ein SIGHUP an alle Jobs.

Massimo
quelle
2
Das ist eine blöde Voreinstellung, aber mein Mut sagt mir, dass es eher ein RH-Fehler als ein Schlag ist. Übrigens können Sie mit zsh &! als Abkürzung, um zu verbergen, und Prozesse, die mit & gegabelt sind, bekommen einen Seufzer.
Jürgen Strobel
7

Ich stimme Warner zu und möchte nur hinzufügen, dass Sie die Shell davon abhalten können, SIGHUP mit dem eingebauten "disown" -Befehl zu senden. Die Bash-Manpage enthält eine gute Beschreibung.

Kim
quelle
4

Mit dem Befehl nohup können Sie den Befehl starten und die Ausgabe in eine nohup-Ausgabedatei umleiten. Von der Nohup-Manpage:

nohup - run a command immune to hangups, with output to a non-tty

Die andere Option ist die Verwendung des Befehls screen . Die Verwendung von screen hat den Vorteil, dass Sie später erneut eine Verbindung zum Prozess herstellen können.

Jim
quelle
Warum die Abstimmungen? Die Verwendung von nohup und screen ist absolut akzeptabel, um zu vermeiden, dass ein Prozess beim Abmelden abgebrochen wird. Es gibt andere, aber beide arbeiten. Was ist das Problem?
Jim
2
Ich denke, es ist ein großartiger Punkt, aber im Q geht es darum, warum seine Prozesse nicht getötet werden, NICHT "wie man sie davon abhält, getötet zu werden".
CarpeNoctem
2

Wenn Sie einen Prozess in den Hintergrund stellen, handelt es sich weiterhin um den untergeordneten Prozess der Shell, die ihn ausführt.

Alle untergeordneten Prozesse, die unter einer Shell ausgeführt werden, erhalten beim Beenden ein SIGHUP. Die Leistung variiert geringfügig, abhängig von der genauen Situation, die ausführlich in der Manpage von bash beschrieben wird. Andere Muscheln haben wahrscheinlich ähnliche Beschreibungen.

Apache und andere Daemons laden normalerweise die Konfiguration auf SIGHUP neu. Userspace-Dienstprogramme sterben oft. Die mit Signalen verknüpfte Anwendungsleistung kann für die Anwendung eindeutig sein.

Warner
quelle
In diesem Fall hätte der Prozess also nur einen SIGHUP erhalten sollen, oder? Vielleicht hat es es einfach ignoriert, ich werde es überprüfen.
Massimo
Ja genau. So sehe ich die Situation. Wenn Sie wirklich an der dokumentierten Leistung zweifeln, können Sie ein kleines Skript auslesen, um das Signal abzufangen und zu protokollieren.
Warner
0

Wie war der Prozess? Die in der vorherigen Veröffentlichung 1 beschriebene Leistung war korrekt.

Bestimmte Skriptfunktionen und -prozesse können Signale abfangen. while-Schleifen können wie verrückt davonlaufen.

Sehen:

SSH-Sitzung wird abgebrochen - Wird der Befehl weiterhin ausgeführt?

Bearbeiten Sie 1 um 16:22 Uhr

Aus der Bash-Manpage:

The shell exits by default upon receipt of a SIGHUP.   Before  exiting,
an  interactive  shell  resends  the  SIGHUP  to  all  jobs, running or
topped.

Erste Untersuchungen 1 zeigen, dass OpenSSH wahrscheinlich SIGHUP ignoriert, möglicherweise mehr Signale.

Warner
quelle
Dieser Beitrag hat mich dazu gebracht, die Frage zu stellen. Einzelheiten finden Sie oben unter Bearbeiten.
Massimo
2
Die Antworten im anderen Thread lassen den
Eindruck entstehen, als müssten
Und 'nohup' ist für Befehle, von denen Sie wissen, dass sie mit einem SIGHUP sterben werden und Sie nicht wollen, dass sie dies tun, denke ich.
Mfinni
Die Manpage sagt es einfach nicht; Ich werde versuchen, es zu töten -HUP morgen ...
Massimo
-1

Wenn Sie den Befehl nicht über ein Tool wie gestartet haben, führen Sie am Ende screender Sitzung alle Jobs / Aufgaben aus, die dieser Sitzung zugeordnet sind.

Labyrinth
quelle
Das ist genau das, was ich dachte, außer ... sie haben es einfach nicht getan.
Massimo
Sie haben jedes Mal, wenn ich das getan habe, was Sie beschrieben haben ... Vielleicht hängt es von der verwendeten Shell ab?
Warren
-1 Sie tun es nicht; Die Antwort ist nicht so einfach. Ich habe gerade ein einfaches Shell-Skript getestet, das ich im Hintergrund gestartet habe. Es wurde eine Schleife ausgeführt und die Ausgabe an eine temporäre Datei gesendet. Es lief weiter, nachdem ich das Terminal verlassen hatte (wie tail -fin der temporären Datei zu sehen). Dies auf einem CentOS 7.1-Computer mit bash.
Mike S
@MikeS - bitte demonstrieren. Ich habe das von Ihnen beschriebene Verhalten noch nie gesehen
warren
@ Warren - Siehe meine Antwort auf serverfault.com/questions/117152/… . Beachten Sie, dass eine Reihe von Personen andere als die von Ihnen beschriebenen Verhaltensweisen angeben. Massimo hat in der Tat genau deshalb gepostet, weil sein Prozess fortgesetzt wurde.
Mike S