Warum wird der Nohup-Hintergrundprozess beendet?

10

Ich habe versucht, ein Shell-Skript über eine Remote-Sitzung zu starten, die mit dem Befehl einen Prozess im Hintergrund startet.

nohup python3 run.py > nohup.out &

Wenn die Remote-Sitzung geschlossen wird, wird der Prozess mit der folgenden Meldung beendet:

Signal SIGHUP gefangen

SIGHUP gefangen, aber nicht dämonisiert. Verlassen.

Ich verstehe nicht; Warum wird der Prozess abgebrochen, als er im Hintergrund mit nohup & gestartet wurde ?

Meistgesuchte Mani
quelle
1
Früher war ich verwirrt über das unerwartete Verhalten der Shell-Jobsteuerung. Jetzt benutze tmuxund ignoriere ich einfach nohupoder lehne die Hintergrundaufgabe vollständig ab.
Siyuan Ren

Antworten:

10

Ihr Python-Programm wird rückgängig gemacht nohup.

nohupignoriert das Auflegesignal mit SIG_IGNund lädt dann Ihr Programm im selben Prozess über die Kette.

Ihr Python-Programm setzt die Signalbehandlung für das Hangup-Signal umgehend zurück und installiert einen eigenen Signalhandler. Dieser Handler überprüft eine interne Funktion (die nicht sehr gut entworfen ist und auf einigen fehlerhaften Annahmen basiert, wenn es die ist, die ich gesehen habe) und entscheidet, dass die geeignete Vorgehensweise beim Empfang eines Auflegesignals darin besteht, diese Nachricht zu drucken und verlassen.

Ihr Python-Programm ist von nohupNatur aus nicht möglich. Auf einem System mit einer Jobsteuerungs-Shell und einer POSIX-Sitzungs- / Job-Semantik müssen Sie disownden Job ausführen, damit die Shell nie davon erfährt, um überhaupt ein Hangup-Signal an ihn zu senden.

(Auch das reicht auf systemd-Betriebssystemen nicht aus. Da die systemd-Mitarbeiter ihren Anmeldesitzungsmechanismus für den Benutzerbereich ein wenig aus dem Häuschen gehalten haben, müssen Sie auch sicherstellen, dass der systemd-Mechanismus, der das Herunterfahren des Systems und nicht das Auflegen signalisiert Anmeldesitzungen bei jeder Abmeldung werden ebenfalls nicht aktiviert.)

Weiterführende Literatur

JdeBP
quelle
3
Ist es ihr Python-Programm, das es tut, oder ist es der Python-Interpreter (/ Laufzeitumgebung), der es still hinter ihrem Rücken tut?
Ilkkachu
Unter Mac OS werden durch das Abmelden von einer SSH-Sitzung Shell-Jobs beendet, selbst wenn Sie mit der Verwendung beginnen nohup. habe kein Heilmittel dafür gefunden
imhotap
Wenn das Problem der Signalhandler ist, könnte das OP den Signalhandler einfach in einen Handler ändern, der den Prozess nicht abbricht. Dies sollte unabhängig davon funktionieren, wer einen solchen Signalhandler installiert. Ich möchte in Bezug auf ssh hinzufügen: Manchmal kann es zu Problemen kommen, selbst wenn der Prozess am Leben bleibt. Vor ein paar Jahren habe ich einige Zeit verloren, um einige Berechtigungsfehler zu verstehen, und am Ende war Kerberos der Schuldige: Als die SSH-Sitzung geschlossen wurde, waren die Token abgelaufen, sodass ich neue Token erstellen musste, um sie anstelle dieser zu verwenden der ssh Sitzung.
Bakuriu
@JdeBP Ich habe versucht setsid nohup python3 run.py > nohup.out &, setsid hat dieses Problem behoben. Ist das ein richtiger Ansatz?
Mostwanted Mani