Normalmente non postare qui, ma mi sto strappando i capelli sopra questo. Ho uno script Python che esegue il fork all'avvio ed è responsabile dell'avvio di un sacco di altri processi. Questo script veniva lanciato all'avvio tramite sysvinit, ma recentemente ho eseguito l'aggiornamento a Debian Jessie, quindi l'ho adattato per l'avvio tramite systemd.
Sfortunatamente, sto riscontrando un problema che non riesco a risolvere. Quando si avvia lo script direttamente in una shell utente, avvia correttamente i processi figlio e quando lo script esce i processi figlio vengono resi orfani e continuano a essere eseguiti.
Quando viene avviato tramite systemd, se il processo padre termina, anche i bambini escono tutti (beh, lo schermo che si lancia in die e appare come morto ???)
Idealmente, devo essere in grado di riavviare lo script padre senza uccidere tutti i processi figlio, c'è qualcosa che mi manca?
Grazie!
[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
Modifica: è probabilmente rilevante per me sottolineare che lo script Python è essenzialmente un "controller" per i suoi processi figlio. Avvia e arresta i server nelle schermate gnu come richiesto da un server centrale. Normalmente è sempre in esecuzione, non genera servizi e non esce. In alcuni casi, tuttavia, vorrei poter ricaricare lo script senza uccidere i processi figlio, anche se ciò significa che i processi sono resi orfani al pid 1. In realtà, non importa nemmeno se lo script Python ha avviato i processi come un processo genitore, se possibile.
Una migliore spiegazione di come funziona:
- Systemd spawns /Server.py
- Server.py esegue il fork e scrive il file pid per Systemd
- Server.py quindi genera i processi del server nella schermata gnu in base alle sue istruzioni
- Server.py continua a funzionare per eseguire qualsiasi riavvio richiesto dal server
Quando si avvia senza Systemd, Server.py può essere riavviato e le schermate gnu che avvia non sono interessate. Quando si avvia con Systemd, quando Server.py si arresta, invece di rendere orfani quei processi di schermo al pid 1, vengono uccisi.
simple
o forking
, in realtà), l'ultima risorsa sarebbe Type=oneshot
, RemainAfterExit=yes
e KillMode=control-group
.
Server.py
codice e una descrizione di come eseguono i fork dei servizi lanciati (se fork). Tuttavia, in generale, si tratta di un problema di mancata corrispondenza del protocollo di disponibilità .