2012-02-01 11 views
45

Uno dei problemi, devo affrontare con supervisord è che quando ho un comando che a sua volta genera un altro processo, supervisord non è in grado di ucciderlo.supervisione arrestando i processi figlio

Per esempio io ho un processo Java, che quando viene eseguito normalmente è come

$ zkServer.sh start-foreground 
$ ps -eaf | grep zk 
user 30404 28280 0 09:21 pts/2 00:00:00 bash zkServer.sh start-foreground 
user 30413 30404 76 09:21 pts/2 00:00:10 java -Dzookeeper.something..something 

Il file di configurazione supervisord assomiglia:

[program:zookeeper] 
command=zkServer.sh start-foreground 
autorestart=true 
stopsignal=KILL 

Questo tipo di processi che hanno più bambino non sono ben gestite da supervisord quando si tratta di fermarli da supervisorctl. Quindi quando eseguo questo dal supervisord e provo a fermarlo da supervisorctl, solo il processo di livello superiore viene ucciso ma non il vero processo java.

+2

È a mia conoscenza che l'uso di ['systemd'] (http://en.wikipedia.org/wiki/Systemd)' init'-replacement di ['cgroups'] (http: //en.wikipedia. org/wiki/Cgroups) consente il monitoraggio affidabile dei processi figli. Potrebbe essere adatto alle tue esigenze. – sarnold

+0

eh stackoverflow sta cambiando di nuovo 'supervisord' in 'supervisionato'! – FUD

risposta

6

Una funzione è stata recentemente aggiunta a supervisord per inviare SIGKILL all'intero gruppo di processi. È in github ma non ancora rilasciato ufficialmente.

Se l'ID di processo è disponibile in un file, è possibile utilizzare il pid-proxy program

65

Lo stesso problema è stato riscontrato da Rick Hanlon II qui: https://coderwall.com/p/4tcw7w

Opzione stopasgroup = true dovrebbe essere impostato nel sezione di programma per supervisord per arrestare non solo il processo padre ma anche i processi figlio.

L'esempio è dato come:

[program:some_django] 
command=python manage.py runserver 
directory=/dir/to/app 
stopasgroup=true 

Inoltre, hanno in mente che si può avere un pacchetto precedente di supervisord che non ha la funzionalità "stopasgroup". Ho provato questi pacchetti Debian su Raspberry Pi:

  • supervisor_3.0a8 non funziona.
  • supervisor_3.0b2-1 funziona come previsto.
+4

Si noti inoltre che supervisord non accetta automaticamente le modifiche alla configurazione. Avrai bisogno di eseguire 'supervisorctl update' per applicare le modifiche alla tua configurazione, o riavviare il processo di supervisione. – jjmontes

+2

Questa dovrebbe essere l'opzione predefinita. –

+0

Questo ha funzionato perfettamente per me con supervisore 3.2. Grazie. – Cerin

11

effettuando le seguenti operazioni nelle prime fasi del script bash principale chiamata dal supervisord risolto il problema per me:

trap "kill -- -$$" EXIT 

Questo uccide l'intero gruppo di processi quando lo script principale uscite, ad esempio quando viene ucciso da supervisord.

0

È inoltre possibile utilizzare le priorità in /conf.d/your-configuration.conf file. Ad esempio, se vuoi eseguire prima zookeeper e poi kafka puoi specificare due programmi.

Priorità inferiore significa che il programma si avvia per primo e si ferma per ultimo.