如何在服务器创建cron定时任务实现Celery自动重启
Celery 进程异常退出自动拉起方案
按以下步骤配置即可实现每15分钟检查一次Celery状态,进程不存在时自动启动:
- 第一步:编写监控脚本
在服务器上创建监控脚本文件,路径建议放在应用用户家目录下,比如/home/myapp/celery_monitor.sh,写入以下内容:
#!/bin/bash # 检查目标Celery worker进程是否存活 ps axuww | grep -v grep | grep "celery -A app.mycelery worker" > /dev/null if [ $? -ne 0 ]; then # 加载虚拟环境、进入项目目录后后台启动Celery source /home/myapp/virtualenv/app/3.8/bin/activate cd /home/myapp/app celery -A app.mycelery worker --concurrency=4 --loglevel=INFO -f celery.log --detach fi
保存后给脚本加可执行权限:chmod +x /home/myapp/celery_monitor.sh
- 第二步:配置定时任务
用启动Celery的业务用户(也就是平时手动启动用的myapp用户,不要用root避免权限冲突)执行crontab -e编辑当前用户的定时任务表,在末尾追加以下配置:
*/15 * * * * /bin/bash /home/myapp/celery_monitor.sh >> /home/myapp/celery_monitor.log 2>&1
保存退出后cron会自动加载新配置,不需要重启服务。
- 验证配置
可以先手动执行pkill -f "celery -A app.mycelery worker"停掉现有Celery进程,再运行/bin/bash /home/myapp/celery_monitor.sh,执行完用ps axuww|grep celery检查,能看到对应worker进程就说明脚本逻辑正常。后续每15分钟cron会自动触发一次检查,执行日志会存在/home/myapp/celery_monitor.log里,出问题可以直接查这个日志定位。
注意:不要把长命令直接写在cron配置里,cron运行时默认加载的环境变量非常精简,不会自动识别虚拟环境路径,也不会默认切换到项目目录,独立写脚本的方式稳定性高很多,后续调整启动参数也更方便。匹配进程时加
grep -v grep是为了过滤grep命令自身的进程,避免误判Celery处于运行状态。
内容的提问来源于stack exchange,提问作者derikS4M1
相关产品推荐
相关产品推荐

