优雅地停止码头工人容器中的芹菜



我在 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" containeriddocker exec containerid kill -15 1

docker kill将杀死容器。您需要做的是仅将信号发送到主芹菜进程。

就我个人而言,我在 docker 容器内使用 supservisord 来管理芹菜工人。默认情况下,主管将发送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

相关内容

  • 没有找到相关文章