使用python包装器脚本在upstart中启动和停止celery进程

时间:2015-03-12 03:11:58

标签: python celery wrapper upstart

所以我们有一个有芹菜工人的应用程序。我们使用类似于以下内容的新手文件/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配置文件,我们的工作流程中还有其他的东西是非常依赖他们。

使用当前的包装器脚本,是否有办法处理停止服务停止的所有芹菜工作者?

1 个答案:

答案 0 :(得分:2)

Workers Guide中对此有一些讨论,但基本上通常的过程是向工作人员发送TERM信号,这将使其等待所有当前正在运行的任务完成在退出清洁之前。

或者,您可以发送KILL信号,如果您希望它立即停止并可能导致数据丢失,但是正如您所说,芹菜在这种情况下无法拦截信号并清理孩子。提到的唯一办法就是像这样手动清理孩子:

$ ps auxww | grep 'celery worker' | awk '{print $2}' | xargs kill -9