使用Ctlr-C键盘中断向Celery工作人员发出两次TERM信号(热关机和冷关机)后,Celery工作人员才挂断电话。它不消耗消息或执行任务(如预期的那样),但它也没有关闭。
我在Celery进程上运行strace
,看看幕后发生了什么。这是Celery主进程PID的strace
输出
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
更新:CPU使用率降至近0%。这些任务非常占用CPU,因此确认当前没有任何任务处于活动状态。
答案 0 :(得分:3)
来自docs:
例如,如果工人在考虑周到的时间后不会关机 由于任务卡在无限循环中,您可以使用KILL 信号强制终止工人,但要注意当前 执行任务将丢失(除非任务具有acks_late 选项集。)
同样来自google groups:
在处理完所有活动任务之前,芹菜不会关闭 其中,active表示已启动的任务(并非全部 保留的任务)。保留的消息将被释放 连接通道关闭后重新传送。有时候是这样的 活动任务返回后。如果你没有 --time-limit启用celeryd永远不会在关机时终止你的任务,即使他们需要DAYS完成。