Запуск и остановка процессов сельдерея в выскочке с помощью скрипта-оболочки python

Итак, у нас есть приложение, в котором есть сельдерейные рабочие. Мы запускаем этих воркеров с помощью файла выскочки /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, но затем upstart просто зависает всякий раз, когда я пытаюсь запустить или остановить службу.

В других сообщениях, которые я нашел по этому поводу, говорится, что нужно вызывать процесс python напрямую, а не использовать скрипт-оболочку, но мы уже создали профили apparmor вокруг этих скриптов, и в нашем рабочем процессе есть другие вещи, которые в значительной степени зависят от них.

Есть ли способ с текущими сценариями-оболочками справиться с уничтожением всех рабочих сельдерея при остановке службы?


person djsumdog    schedule 12.03.2015    source источник


Ответы (1)