所以我们有一个有芹菜工人的应用程序。我们使用类似于以下内容的新手文件/etc/init/fact-celery.conf
启动这些工作人员:
description "FaCT Celery Worker."
start on runlevel [2345]
stop on runlevel [06]
respawn
respawn limit 10 5
setuid fact
setgid fact
script
[ -r /etc/default/fact ] && . /etc/default/fact
if [ "$START_CELERY" != "yes" ]; then
echo "Service disabled in '/etc/default/fact'. Not starting."
exit 1
fi
ARGUMENTS=""
if [ "$BEAT_SERVICE" = "yes" ]; then
ARGUMENTS="--beat"
fi
/usr/bin/fact celery worker --loglevel=INFO --events --schedule=/var/lib/fact/celerybeat-schedule --queues=$CELERY_QUEUES $ARGUMENTS
end script
它调用python包装器脚本,如下所示:
#!/bin/bash
WHOAMI=$(whoami)
PYTHONPATH=/usr/share/fact
PYTHON_BIN=/opt/fact-virtual-environment/bin/python
DJANGO_SETTINGS_MODULE=fact.settings.staging
if [ ${WHOAMI} != "fact" ];
then
sudo -u fact $0 $*;
else
# Python needs access to the CWD, but we need to deal with apparmor restrictions
pushd $PYTHONPATH &> /dev/null
PYTHONPATH=${PYTHONPATH} DJANGO_SETTINGS_MODULE=${DJANGO_SETTINGS_MODULE} ${PYTHON_BIN} -m fact.managecommand $*;
popd &> /dev/null
fi
这种设置的问题在于,当我们停止服务时,我们会离开不会死的pact-celery工作人员。由于某种原因,新贵无法跟踪分叉进程。我在一些类似的帖子中读过,新贵不能跟踪两个以上的分叉。
我已尝试使用expect fork
,但每当我尝试启动或停止服务时,新手就会挂起。
我发现的其他帖子说直接调用python进程而不是使用包装器脚本,但是我们已经围绕这些脚本构建了apparmor配置文件,我们的工作流程中还有其他的东西是非常依赖他们。
使用当前的包装器脚本,是否有办法处理停止服务停止的所有芹菜工作者?
答案 0 :(得分:2)
在Workers Guide中对此有一些讨论,但基本上通常的过程是向工作人员发送TERM
信号,这将使其等待所有当前正在运行的任务完成在退出清洁之前。
或者,您可以发送KILL
信号,如果您希望它立即停止并可能导致数据丢失,但是正如您所说,芹菜在这种情况下无法拦截信号并清理孩子。提到的唯一办法就是像这样手动清理孩子:
$ ps auxww | grep 'celery worker' | awk '{print $2}' | xargs kill -9