我有一个装有 celery 工作者的盒子,其中一些执行相当长时间运行的任务(几分钟)。当此盒子更新时,我想正常关闭 celery 工作者,因此理想情况下:
- 不再向工人发送新任务
- 允许现有任务完成(有一定的超时时间)
- 工人最终被杀死,新的工人开始工作
我使用 systemd 来管理 Ubuntu 机器上的服务。这是我的配置文件:
[Unit]
Description=Celery Service
After=network.target
[Service]
User=celery
Type=forking
WorkingDirectory=/var/app/celery/
ExecStart=/var/app/celery/run_celery.sh
ExecStop=/var/app/celery/stop_celery.sh
Nice=1
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
run_celery.sh 脚本包含(简要):
celery multi start 2 -A my_app --pidfile=/tmp/celery-%n.pid
stop_celery.sh 包含:
celery multi stopwait 2 --pidfile=/tmp/celery-%n.pid
但是当我使用 systemctl 停止脚本时,任务会被终止,而不是让工作进程完成。我做错了什么?
答案1
您可能希望将TimeoutStopSec=
超时时间设置为您想要的值。请参阅systemd.service
手册页以获取更多详细信息。