2012-07-07 12 views
7

Estoy usando tornado para ejecutar una aplicación de matraz, y tengo un script de shell que hace un poco de trabajo y luego ejecuta la aplicación.Tornado no se reinicia limpiamente en el supervisor

#!/usr/bin/env bash 
some_work 
more_work 
python /usr/share/theapp/theapp.py 

Yo uso el supervisor para administrar este pequeño script. El inicio funciona bien (sudo supervisorctl start theapp.sh), pero cuando quiero reiniciar, el subproceso de python no sale y se cuelga, ocupando el puerto y evitando el inicio nuevamente. Intenté agregar trampas para asegurarme de que el código python realmente se detiene cuando el supervisor detiene la secuencia de comandos, pero esto no funcionó. Intenté desconectar tornado para el servidor wsgi de gevent y tuve el mismo problema. ¿Cómo debería estar haciendo este pequeño guión?

Respuesta

0

Tuve problemas similares con supervisord y uwsgi, pero también podría ser válido para Tornado. El problema es con la señal que el servicio Tornado espera reiniciar. La señal predeterminada que supervisord envía es SIG_TERM (mira stopsignal in docs). No estoy seguro de lo que espera del tornado, pero se puede probar algunos más opciones en la configuración supervisord, como:

# /etc/supervisor.d/myprogram.ini 
# http://supervisord.org/configuration.html#program-x-section-values 
[program:myprogram] 
command=/path/to/script/ 
.... 
stopsignal=INT 

o

stopsignal=HUP 
+0

Oye, solo como una nota: supervisord siguió enviando SIGKILL, así que lo abandoné y cambié al advenedizo de Ubuntu, que maneja las señales correctamente. –

8

La señal TERM sólo se envía a la escritura del golpe theapp.sh y nunca recibido por el proceso de Python. Puede probar la opción stopasgroup en la sección del programa de la configuración del supervisor, que es más compatible con cómo bash (y otros shells) manejan las señales [1].

[1] http://www.vidarholen.net/contents/blog/?p=34

+2

'stopasgroup = true' trabajado para mí con una aplicación Tornado (pilbox) –

0

Alternativamente, si la secuencia de comandos shell solamente hace cosas preparacion y nada después del comando "real", se puede sustituir la última línea con

exec python /usr/share/theapp/theapp.py 

que sustituirá a la concha proceso con el proceso python, por lo que este último obtiene la señal directamente y con el beneficio adicional de que no tiene un proceso de shell inactivo todo el tiempo.

Cuestiones relacionadas