zoukankan      html  css  js  c++  java
  • 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=
  • 相关阅读:
    自动装配
    SpringMVC
    线程池的类型以及执行线程submit()和execute()的区别
    JDBC配置文件db.properties(Mysql) 及dbutils的编写
    tokuDB 安装与备份小记
    CentOS 7 安装 LEMP
    MySQL 闪回工具之 binlog2sql
    解决 MySQL 分页数据错乱重复
    ClickHouse 快速入门
    【理论篇】Percona XtraBackup 恢复单表
  • 原文地址:https://www.cnblogs.com/lijianming180/p/12247825.html
Copyright © 2011-2022 走看看