GNU/Linux >> Znalost Linux >  >> Linux

Systemd a proces spawnování:podřízené procesy jsou zabity, když hlavní proces skončí?

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 pro systemd
  • 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!

Související:Linux – jak zrušit sdílení sítě pro aktuální proces?
Linux
  1. Linux:Najděte a zabijte zombie procesy

  2. Co zabilo můj proces a proč?

  3. Nelze odpojit podřízený proces, když je hlavní proces spuštěn ze systemd

  1. Co jsou zombie procesy a jak najít a zabít zombie procesy?

  2. Kdy je Dd vhodné pro kopírování dat? (neboli, kdy jsou čtení() a zápis() částečné)?

  3. Jsou vlákna jádra Linuxu skutečně procesy jádra?

  1. Proč není Pgid procesů dítěte PGID rodiče?

  2. UNIX / Linux Procesy:C fork() Funkce

  3. Jak ladit proces spouštění systemd v CentOS/RHEL 7 a 8