Normalmente non posto qui, ma mi sto strappando i capelli per questo.
Ho uno script Python che si biforca all'avvio ed è responsabile dell'avvio di un sacco di altri processi. Questo script veniva lanciato all'avvio tramite sysvinit
, ma recentemente ho aggiornato a Debian Jessie, quindi l'ho adattato per l'avvio tramite systemd
.
Sfortunatamente, sto riscontrando un problema che non riesco a risolvere. Quando avvii lo script direttamente in una shell utente, i processi secondari vengono avviati correttamente e quando lo script esce i processi secondari restano orfani e continuano a essere eseguiti.
Quando viene avviato tramite systemd, se il processo padre esce, anche tutti i figli escono (Bene, lo screen
s che si lanciano nel dado e appaiono come Morti).
Idealmente devo essere in grado di riavviare lo script padre senza uccidere tutti i processi figlio, c'è qualcosa che mi sfugge?
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 è importante per me sottolineare che lo script Python è essenzialmente un "controller" per i suoi processi figlio. Avvia e arresta i server in GNU screen
s come richiesto da un server centrale. Normalmente è sempre in esecuzione, non genera servizi e non esce.
Tuttavia, ci sono casi in cui vorrei essere in grado di ricaricare lo script senza uccidere i processi figlio, anche se ciò significa che i processi sono rimasti orfani su pid 1. In effetti, non avrebbe nemmeno importanza se lo script Python avesse avviato i processi come un processo padre, se possibile.
Una migliore spiegazione di come funziona:
systemd
generaServer.py
Server.py
esegue il fork e scrive il file pid persystemd
Server.py
quindi genera i processi del server nella schermata di gnu in base alle sue istruzioniServer.py
continua a funzionare per eseguire eventuali riavvii richiesti dal server
All'avvio senza systemd
, Server.py
può essere riavviato e le screens
di GNU si avvia non sono interessati. All'avvio con systemd
, quando Server.py
si spegne, invece di rendere orfani i processi dello schermo al pid 1, vengono uccisi.
Risposta accettata:
Sono riuscito a risolvere questo problema semplicemente impostando KillMode
per process
invece di control-group
(predefinito). Grazie a tutti!