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 ?
background-process
nohup
Meistgesuchte Mani
quelle
quelle
tmux
und ignoriere ich einfachnohup
oder lehne die Hintergrundaufgabe vollständig ab.Antworten:
Ihr Python-Programm wird rückgängig gemacht
nohup
.nohup
ignoriert das Auflegesignal mitSIG_IGN
und 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
nohup
Natur aus nicht möglich. Auf einem System mit einer Jobsteuerungs-Shell und einer POSIX-Sitzungs- / Job-Semantik müssen Siedisown
den 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
quelle
nohup
. habe kein Heilmittel dafür gefundensetsid nohup python3 run.py > nohup.out &
, setsid hat dieses Problem behoben. Ist das ein richtiger Ansatz?