GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Systemd und Process Spawning:Untergeordnete Prozesse werden beendet, wenn der Hauptprozess beendet wird?

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 erzeugt Server.py
  • Server.py Forks und schreibt die PID-Datei für systemd
  • Server.py erzeugt dann Serverprozesse im GNU-Bildschirm basierend auf seinen Anweisungen
  • Server.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!

Verwandte:Linux – wie kann man das Netzwerk für den aktuellen Prozess freigeben?
Linux
  1. Was sind Zombie-Prozesse und wie findet und tötet man Zombie-Prozesse?

  2. Wann ist Dd zum Kopieren von Daten geeignet? (oder wann sind Read() und Write() partiell)?

  3. Warum ist die PGID der untergeordneten Prozesse nicht die PGID des übergeordneten Prozesses?

  4. Eingabeprozess und Anzahl der erklärten Prozesse

  5. UNIX-/Linux-Prozesse:C fork()-Funktion

Meistern Sie den Linux-Kill-Prozess mit ps, pgrep, pkill und mehr

So beenden Sie Prozesse in Linux mit kill, killall und pkill

Wie finde ich alle untergeordneten Prozesse?

Der untergeordnete Prozess kann nicht getrennt werden, wenn der Hauptprozess von systemd gestartet wird

Linux-SSH-Bash-Fork-Wiederholung:keine untergeordneten Prozesse

Wie geht systemd mit dem Tod eines untergeordneten Elements eines verwalteten Prozesses um?