Normálně sem nepište, ale z tohohle si rvu vlasy.
Mám skript Pythonu, který se při spuštění rozvětvuje a je zodpovědný za spouštění spousty dalších procesů. Tento skript se spouštěl při startu pomocí sysvinit
, ale nedávno jsem upgradoval na Debian Jessie, takže jsem si jej upravil pro spuštění přes systemd
.
Bohužel narážím na problém, se kterým si nevím rady. Když skript spustíte přímo v uživatelském prostředí, spustí se jeho podřízené procesy správně, a když skript skončí, podřízené procesy jsou osiřelé a běží dál.
Když se po spuštění přes systemd ukončí nadřazený proces, ukončí se i všechny podřízené (screen
s tím, že odstartují v kostce a objeví se jako mrtví).
V ideálním případě musím mít možnost restartovat nadřazený skript bez zabití všech podřízených procesů. Je něco, co mi chybí?
Díky!
[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
Upravit:
Pravděpodobně je pro mě relevantní poukázat na to, že skript Python je v podstatě ‚kontrolér‘ pro své podřízené procesy. Spouští a zastavuje servery na screen
GNU s podle požadavků centrálního serveru. Normálně je vždy spuštěn, nevytváří služby a neukončuje se.
Existují však případy, kdy bych chtěl být schopen znovu načíst skript bez zabíjení podřízených procesů, i když to znamená, že procesy jsou osiřelé na pid 1. Ve skutečnosti by ani nezáleželo na tom, kdyby skript Pythonu spouštěl procesy jako nadřazený proces, pokud je to vůbec možné.
Lepší vysvětlení toho, jak to funguje:
systemd
vytvoříServer.py
Server.py
rozvětví a zapíše soubor pid prosystemd
Server.py
poté vytvoří procesy serveru na obrazovce gnu na základě jeho pokynůServer.py
pokračuje v běhu, aby provedl restarty požadované ze serveru
Při spouštění bez systemd
, Server.py
lze restartovat a GNU screens
jeho spouštění není ovlivněno. Při spouštění pomocí systemd
, když Server.py
se vypne, místo toho, aby se tyto procesy obrazovky osiřely na pid 1, jsou zabity.
Přijatá odpověď:
Podařilo se mi to opravit jednoduše nastavením KillMode
process
místo control-group
(výchozí). Díky všem!