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.
simpleo forking, in realtà), l'ultima risorsa sarebbe Type=oneshot, RemainAfterExit=yese KillMode=control-group.
Server.pycodice 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à .