背景
在进行celery定时任务测试时,发现到点任务并未执行,检查了log发现在启动celery beat的时候有这样一个报错,所以celery beat并未启动成功。
1 | (hzinfo) E:PythonWorkSpacehzinfo>celery beat v3.1.0 (Cipater) is starting. |
排查
celery beat在运行时,会自动创建两个文件:
- pidfile:默认为celerybeat.pid,保存在项目根目录。
- scheduler:默认为celerybeat-schedule,保存在项目根目录。
这里的报错说明pidfile已存在。
看下官网的说明
–pidfile
File used to store the process pid. Defaults to celerybeat.pid.
The program won’t start if this file already exists and the pid is still alive.
上次运行的时候,已经自动创建了,进程结束的时候并未自动删除,从而导致再次运行的时候报错了。
直接删除这个pidfile文件,再次启动celery beat
1 | celery -A manage.celery beat -s "celery_app/celerybeat-schedule" |
运行成功了。
那么难道每次重启都得先删除么?
虽然官网上没提,但是参考网上说法,如果在启动celery beat的时候配置pidfile参数,并将该参数设置为空,可以规避这个问题。
1 | start /b celery -A manage.celery beat -s "celery_app/celerybeat-schedule" --pidfile= |
测试了下,果然并没有生成pidfile,且程序也运行成功了。
总结
celery beat在运行时会生成一个pidfile文件用于记录当前的pid。且该文件不会因进程的结束而自动删除。当再次创建celery beat进程的时候,会因为已存在这个文件而启动失败。
解决方式有两种:
在启动前检测是否存在改文件并删除后再启动
通过启动时指定空参数的方式规避:
1
celery -A manage.celery beat -s "celery_app/celerybeat-schedule" --pidfile=