Ihr Python-Programm macht es rückgängig nohup.

Ihr Python-Programm macht es rückgängig nohup.

Ich habe versucht, über eine Remotesitzung ein Shellskript zu starten, das mit dem Befehl einen Prozess im Hintergrund startet.

nohup python3 run.py > nohup.out &

Wenn die Remotesitzung geschlossen wird, wird der Prozess mit der folgenden Meldung beendet:

Signal SIGHUP gefangen

SIGHUP wurde abgefangen, aber nicht als Daemon ausgeführt. Wird beendet.

Ich verstehe nicht; warum wird der Prozess beendet, wenn er im Hintergrund gestartet wurde mitnein &?

Antwort1

Ihr Python-Programm macht es rückgängig nohup.

nohupignoriert das Auflegesignal SIG_IGNund lädt dann Ihr Programm im selben Vorgang nach.

Ihr Python-Programmsetzt sich umgehend zurückdie Signalverarbeitung für das Auflegesignal, indem ein eigener Signalhandler installiert wird. Dieser Handler überprüft eine interne Funktion (die nicht sehr gut konzipiert ist, da sie 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 auszudrucken und zu beenden.

Ihr Python-Programm ist von Natur aus nicht nohup-fähig. Auf einem System mit einer Job-Kontroll-Shell und POSIX-Sitzungs-/Job-Semantik müssen Sie disownden Job so konfigurieren, dass die Shell nie davon erfährt, um überhaupt ein Auflegesignal an ihn zu senden.

(Selbst das reicht bei systemd-Betriebssystemen nicht aus. Da die systemd-Leute ihren Mechanismus für Login-Sitzungen im Benutzerbereich ziemlich verpfuscht haben, müssen Sie außerdem sicherstellen, dass der Mechanismus von systemd, der Login-Sitzungen bei jeder Abmeldung das Herunterfahren des Systems statt das Auflegen signalisiert, ebenfalls nicht greift.)

Weiterführende Literatur

verwandte Informationen