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