bash - Supervisión para detener procesos infantiles.
apache-zookeeper supervisord (6)
Uno de los problemas que enfrento con supervisord es que cuando tengo un comando que a su vez genera otro proceso, supervisord no puede matarlo.
Por ejemplo, tengo un proceso java que cuando se ejecuta normalmente es como
$ 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
El archivo de configuración de supervisor es como:
[program:zookeeper]
command=zkServer.sh start-foreground
autorestart=true
stopsignal=KILL
Este tipo de procesos que tienen varios hijos no están bien manejados por supervisord cuando se trata de detenerlos de supervisorctl
. Así que cuando ejecuto esto desde el supervisor y trato de detenerlo desde supervisorctl, solo se elimina el proceso de nivel superior pero no el proceso de Java real.
Al hacer lo siguiente al principio del script de bash principal llamado por supervisor, me solucioné el problema:
trap "kill -- -$$" EXIT
Esto mata a todo el grupo de procesos cuando sale la secuencia de comandos principal, como cuando es eliminado por supervisord.
El siguiente artículo tiene una discusión en profundidad del problema:
http://veithen.github.io/2014/11/16/sigterm-propagation.html
Rick Hanlon II encontró el mismo problema aquí: https://coderwall.com/p/4tcw7w
La opción stopasgroup = true debe configurarse en la sección del programa para que supervisord detenga no solo el proceso principal, sino también los procesos secundarios.
El ejemplo se da como:
[program:some_django]
command=python manage.py runserver
directory=/dir/to/app
stopasgroup=true
Además, tenga en cuenta que puede tener un paquete anterior de supervisor que no tiene la funcionalidad "stopasgroup". Probé estos paquetes Debian en Raspberry Pi:
- supervisor_3.0a8 no funciona.
- supervisor_3.0b2-1 funciona como se espera.
También puede usar las prioridades en el archivo /conf.d/your-configuration.conf
. Por ejemplo, si desea ejecutar primero zookeeper y luego kafka, puede especificar dos programas.
La prioridad más baja significa que el programa se inicia primero y se detiene en último lugar.
intente esta configuración del programa supervisor:
stopasgroup=true
killasgroup=true
stopsignal=INT