我有一个芹菜运行在docker容器中处理来自rabbitmq的任务。我试图停止并删除芹菜容器,同时允许当前运行的任务完成。文档建议将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
答案 0 :(得分:1)
docker kill
会杀死容器。您需要做的是仅将信号发送到主芹菜过程。
我个人在docker容器内使用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