celery beat之pidfile already exists问题

背景

在进行celery定时任务测试时,发现到点任务并未执行,检查了log发现在启动celery beat的时候有这样一个报错,所以celery beat并未启动成功。

1
2
3
4
(hzinfo) E:PythonWorkSpacehzinfo>celery beat v3.1.0 (Cipater) is starting.
ERROR: Pidfile (celerybeat.pid) already exists.
Seems we're already running? (pid: 22220)
* Restarting with stat

排查

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

大专栏  celery beat之pidfile already exists问题e class="highlight shell">
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=
原文地址:https://www.cnblogs.com/lijianming180/p/12247825.html