Подтвердить что ты не робот

Почему сельдерей не закрывается чисто?

После выдачи сигнала TERM дважды работнику сельдерея (Теплый останов и холодное отключение) с использованием прерывания клавиатуры Ctlr-C рабочий-сельдерей просто повесил трубку. Он не потребляет сообщения или выполняет задачи (как и ожидалось), но он также не отключается.

Я побежал strace на процессы Сельдерея, чтобы увидеть, что происходит за сценой. Здесь вывод strace на PID основного процесса сельдерея

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

И вот что я нашел для strace для дочерних процессов:

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
......................................................

Я знаю, что могу передать сигнал KILL процессам, чтобы избавиться от них. Но мне любопытно узнать, что на самом деле предотвращает остановку этих процессов, и если можно что-то сделать с этим.

Программный стек: Python 2.6.2, Celery 2.4.6, CentOS 5.0

ОБНОВЛЕНИЕ: использование ЦП почти до 0%. Эти задачи достаточно интенсивные, поэтому это подтверждает, что никакие задачи в данный момент не активны.

4b9b3361

Ответ 1

Из docs:

Если рабочий отключится после внимательного времени, например из-за задач, застрявших в бесконечном цикле, вы можете использовать KILL сигнал для принудительного прекращения работника, но помните, что в настоящее время выполнение задач будет потеряно (если только задачи не имеют acks_late набор опций).

Также из групп google:

celeryd не будет закрыт, пока все активные задачи не будут обработаны, где активно означает задачи, которые были запущены (не все зарезервированные задачи). Зарезервированные сообщения будут выпущены и после того, как канал соединения закрыт. Бывает после возвращения активных задач. если у вас нет - ограничение по времени celeryd никогда не будет убивать ваши задачи при завершении работы, даже если они завершат DAYS.