Poste normalerweise nicht hier, aber ich reiße mir die Haare darüber aus. Ich besitze ein Python-Skript, das beim Start abgefragt wird 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 und 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 Benutzershell starten, werden die untergeordneten Prozesse ordnungsgemäß gestartet, und wenn das Skript beendet wird, werden die untergeordneten Prozesse verwaist und weiterhin ausgeführt.
Wenn der übergeordnete Prozess über systemd gestartet wird, werden auch alle untergeordneten Prozesse beendet. (Nun, der Bildschirm, den sie starten, wird als tot angezeigt. ???)
Idealerweise muss ich in der Lage sein, das übergeordnete Skript neu zu starten, ohne alle untergeordneten Prozesse zu beenden. Fehlt mir etwas?
Vielen Dank!
[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 in Gnu-Bildschirmen, wie von einem zentralen Server angefordert. Es läuft normalerweise immer, es spawnt keine Dienste und beendet sich nicht. Es gibt jedoch Fälle, in denen ich das Skript neu laden möchte, ohne untergeordnete Prozesse zu beenden, auch wenn dies bedeutet, dass die Prozesse auf PID 1 verwaist sind. Tatsächlich spielt es keine Rolle, ob das Python-Skript Prozesse als gestartet hat ein übergeordneter Prozess, wenn das überhaupt möglich ist.
Eine bessere Erklärung, wie es funktioniert:
- Systemd erzeugt /Server.py
- Server.py gibt die PID-Datei für Systemd aus und schreibt sie
- Server.py erzeugt dann Serverprozesse auf dem Gnu-Bildschirm basierend auf seinen Anweisungen
- Server.py wird weiterhin ausgeführt, um alle vom Server angeforderten Neustarts durchzuführen
Wenn Server.py ohne Systemd gestartet wird, kann es neu gestartet werden, und die von ihm gestarteten Gnu-Bildschirme sind nicht betroffen. Beim Starten mit Systemd werden beim Herunterfahren von Server.py diese Bildschirmprozesse nicht auf PID 1 verwaist, sondern beendet.
simple
oder forking
tatsächlich), wäre der letzte Ausweg sein Type=oneshot
, RemainAfterExit=yes
und KillMode=control-group
.
Server.py
Code und eine Beschreibung darüber zu haben, wie die gestarteten Dienste gegabelt werden (wenn sie gegabelt werden). Im Allgemeinen handelt es sich jedoch um ein Problem mit der Nichtübereinstimmung des Bereitschaftsprotokolls .