
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
.
nohup
ignoriert das Auflegesignal SIG_IGN
und 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 disown
den 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
- https://docs.cherrypy.org/en/latest/_modules/cherrypy/process/plugins.html
- Versucht nohup, dafür zu sorgen, dass das Programm kein Steuerterminal hat?
- Unterschied zwischen nohup, disown und &
- Wenn tmux beendet wird (pty-Master schließt), werden Hintergrundprozesse von Startskripten beendet – warum?
- https://unix.stackexchange.com/a/310775/5132
- https://unix.stackexchange.com/a/379264/5132