Normalerweise posten Sie hier nicht, aber ich reiße mir die Haare über diesen.
Ich habe ein Python-Skript, das sich beim Start verzweigt und für das Starten einer Reihe anderer Prozesse verantwortlich ist. Dieses Skript wurde früher beim Start über sysvinit
gestartet , aber kürzlich habe ich ein Upgrade auf Debian Jessie durchgeführt, also habe ich es so angepasst, dass es über systemd
gestartet werden kann .
Leider stoße ich auf ein Problem, das ich nicht lösen kann. Wenn Sie das Skript direkt in einer Benutzer-Shell starten, werden die untergeordneten Prozesse korrekt gestartet, und wenn das Skript beendet wird, werden die untergeordneten Prozesse verwaist und werden weiterhin ausgeführt.
Wenn der übergeordnete Prozess beendet wird, wenn er über systemd gestartet wird, werden auch alle untergeordneten Prozesse beendet (Nun, der screen
dass sie in sterben starten und als tot erscheinen).
Idealerweise muss ich in der Lage sein, das übergeordnete Skript neu zu starten, ohne alle untergeordneten Prozesse zu beenden. Gibt es etwas, das ich vermisse?
Danke!
[Unit]
Description=Server commander
After=network.target
[Service]
User=serveruser
Type=forking
PIDFile=/var/Server/Server.pid
ExecStart=/var/Server/Server.py
ExecStop=/bin/kill -s TERM $MAINPID
[Install]
WantedBy=multi-user.target
Bearbeiten:
Es ist wahrscheinlich relevant für mich, darauf hinzuweisen, dass das Python-Skript im Wesentlichen ein „Controller“ für seine untergeordneten Prozesse ist. Es startet und stoppt Server im GNU screen
s wie von einem zentralen Server angefordert. Es läuft normalerweise immer, es erzeugt keine Dienste und wird nicht beendet.
Es gibt jedoch Fälle, in denen ich das Skript neu laden möchte, ohne untergeordnete Prozesse zu beenden, selbst wenn dies bedeutet, dass die Prozesse auf PID 1 verwaisen. Tatsächlich wäre es nicht einmal wichtig, ob das Python-Skript Prozesse als gestartet hätte einen übergeordneten Prozess, falls das überhaupt möglich ist.
Eine bessere Erklärung, wie es funktioniert:
systemd
erzeugtServer.py
Server.py
Forks und schreibt die PID-Datei fürsystemd
Server.py
erzeugt dann Serverprozesse im GNU-Bildschirm basierend auf seinen AnweisungenServer.py
wird weiterhin ausgeführt, um vom Server angeforderte Neustarts durchzuführen
Beim Start ohne systemd
, Server.py
kann neu gestartet werden und die GNU screens
es startet sind nicht betroffen. Beim Starten mit systemd
, wenn Server.py
herunterfährt, anstatt dass diese Screen-Prozesse auf PID 1 verwaisen, werden sie beendet.
Akzeptierte Antwort:
Ich habe es geschafft, dies einfach zu beheben, indem ich KillMode
eingestellt habe zu process
statt control-group
(Ursprünglich). Danke an alle!