2012-04-02 14 views
11

Después de emitir la señal TERM para el empleado de Apio dos veces (apagado cálido y apagado en frío) utilizando la interrupción del teclado Ctlr-C, el trabajador de Apio se colgó. No está consumiendo mensajes ni está ejecutando tareas (como se esperaba), pero tampoco se está cerrando.¿Por qué el apio no se cierra limpiamente?

Ejecuté strace en los procesos de Apio para ver qué ocurre detrás de la escena. Aquí está la salida strace en el PID del proceso principal apio

strace -p 27867 
Process 27867 attached - interrupt to quit 
futex(0xb966a78, FUTEX_WAIT, 0, NULL 

Y aquí está lo que encontré haciendo strace en los procesos secundarios:

strace -p 27874 
Process 27874 attached - interrupt to quit 
select(4, [3], NULL, NULL, {0, 562000}) = 0 (Timeout) 
futex(0x871a808, FUTEX_WAKE, 1)   = 0 
select(4, [3], NULL, NULL, {1, 0})  = 0 (Timeout) 
futex(0x871a808, FUTEX_WAKE, 1)   = 0 
...................................................... 

Sé que podría emitir una señal KILL para los procesos a Deshazte de ellos. Pero tengo curiosidad por saber qué es lo que realmente impide que se cierren estos procesos, y si es posible hacer algo al respecto.

pila de software: Python 2.6.2, apio 2.4.6, CentOS 5.0

UPDATE: El uso de la CPU se ha reducido a casi 0%. Estas tareas consumen bastante CPU, por lo que esto confirma que no hay tareas actualmente activas.

Respuesta

3

Desde el docs:

Si el trabajador no apagado después de tiempo considerado, por ejemplo debido a tareas atrapados en un bucle infinito, se puede utilizar la señal KILL para obligar a interrumpir el trabajador , pero tenga en cuenta que actualmente se perderán las tareas de ejecución (a menos que las tareas tengan la opción acks_late establecida).

También desde google groups:

celeryd no se apagará hasta que todas las tareas activas han sido procesados, donde significa activa las tareas que se han iniciado en (no todos tareas reservadas). Los mensajes reservados se liberarán y se volverá a entregar una vez que se cierre el canal de conexión. Esto ocurre después de que hayan regresado las tareas activas. si no tiene un - el límite de tiempo habilitado apéndice nunca matará a sus tareas en el cierre, incluso si toman DAYS para completar.

+2

no hay tareas activas. Las tareas que se habían estado ejecutando en el momento de emitir la señal de parada se terminaron. La longitud de la cola sigue siendo la misma. No se está enviando nada a los registros. Pero los procesos aún no están finalizando. Como dije, * puedo * emitir un KILL y deshacerme de ellos. Pero esto no será una solución efectiva. Para usar este software de manera confiable, necesito poder detenerlo (y comenzar) automáticamente con poca o ninguna intervención manual. – rubayeet

+1

Una buena solución para esto es demonizar el apio. Supervisord es un excelente candidato. – hymloth

+1

Estoy usando los scripts de inicio genéricos para demonizar a los trabajadores: https://github.com/ask/celery/blob/master/contrib/generic-init.d/celeryd – rubayeet

Cuestiones relacionadas