2016-02-01 1 views
1

У меня есть сельдерей, работающий в контейнерах для докерных контейнеров из кролика. Я пытаюсь остановить и удалить контейнер из сельдерея, позволяя выполнять текущие текущие задачи. Документы предполагают, что отправка сигналов TERM или INT в основной процесс должна производиться в тесном отключении сельдерея, хотя я считаю, что детские процессы просто убивают.Изящно останавливая сельдерей в контейнере для докеров

При отправке TERM запущенных процессах он бросает:

WorkerLostError('Worker exited prematurely: signal 15 (SIGTERM).',)

Когда я посылаю INT процесс работает только выход без ошибок, хотя это тоже не позволяет задачу закончить, как документы предлагать.

Я начинаю контейнер Docker с помощью команды: su -m celery_user -c "python manage.py celery worker -Q queue-name"

Любые мысли о том, почему это может происходить? Может быть, сигнал заканчивается контейнером, а также процессом сельдерея?

Я посылаю сигнал с: docker kill --signal="TERM" containerid или docker exec containerid kill -15 1

ответ

1

docker kill убьет контейнер. Что вам нужно сделать, так это отправить сигнал только на основной процесс сельдерея.

Лично я использую supservisord внутри контейнера докера, чтобы управлять работником сельдерея. По умолчанию supervisord отправит SIGTERM, чтобы остановить процесс.

Вот пример супервизор конфигурации для сельдерея

[program:celery] 
command=celery worker -A my.proj.tasks --loglevel=DEBUG -Ofair --hostname celery.host.domain.com --queues=celery 
environment=PYTHONPATH=/etc/foo/celeryconfig:/bar/Source,PATH=/foo/custom/bin:/usr/kerberos/bin 
user=celery-user 
autostart=true 
stdout_logfile=/var/log/supervisor/celery.log 
redirect_stderr=true 
+0

Ahh - да, я имел это в моей голове, что руководитель может вызвать то же самое. Спасибо, супервайзер работает. – Andrew