GNU/Linux >> Linux Esercitazione >  >> Linux

Systemd e spawn dei processi:i processi figlio vengono uccisi quando il processo principale esce?

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 genera Server.py
  • Server.py esegue il fork e scrive il file pid per systemd
  • Server.py quindi genera i processi del server nella schermata di gnu in base alle sue istruzioni
  • Server.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!

Correlati:Linux:come annullare la condivisione della rete per il processo corrente?
Linux
  1. Cosa sono i processi Linux, i thread, i processi leggeri e lo stato del processo

  2. Come far morire il processo figlio dopo che il genitore è uscito?

  3. Cosa ha ucciso il mio processo e perché?

  4. Come trovare tutti i processi figlio?

  5. Quando usare pthread_exit() e quando usare pthread_join() in Linux?

Padroneggia il processo di uccisione di Linux utilizzando ps, pgrep, pkill e altro

Come uccidere i processi in Linux usando kill, killall e pkill

Impossibile scollegare il processo figlio quando il processo principale viene avviato da systemd

Come eseguire uno script quando arriva una posta nel server di posta? (Debian)

I thread del kernel di Linux sono davvero processi del kernel?

In che modo systemd gestisce la morte di un figlio di un processo gestito?