bash apache-zookeeper supervisord ubuntu-11.04

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.



Recientemente se agregó una característica a supervisord para enviar SIGKILL a todo el grupo de procesos. Está en github pero aún no se ha lanzado oficialmente.

Si la identificación del proceso está disponible en un archivo, puede usar el programa pid-proxy


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