celerybeat 报错 DBFileExistsError
环境
- python2.7
- celery==4.0.1
报错信息
[2018-05-02 13:55:02,346: WARNING/MainProcess] return self.get_scheduler()
[2018-05-02 13:55:02,346: WARNING/MainProcess] File "/usr/local/lib/python2.7/site-packages/celery/beat.py", line 567, in get_scheduler
[2018-05-02 13:55:02,346: WARNING/MainProcess] lazy=lazy,
[2018-05-02 13:55:02,346: WARNING/MainProcess] File "/usr/local/lib/python2.7/site-packages/celery/beat.py", line 407, in __init__
[2018-05-02 13:55:02,347: WARNING/MainProcess] Scheduler.__init__(self, *args, **kwargs)
[2018-05-02 13:55:02,347: WARNING/MainProcess] File "/usr/local/lib/python2.7/site-packages/celery/beat.py", line 204, in __init__
[2018-05-02 13:55:02,347: WARNING/MainProcess] self.setup_schedule()
[2018-05-02 13:55:02,347: WARNING/MainProcess] File "/usr/local/lib/python2.7/site-packages/celery/beat.py", line 433, in setup_schedule
[2018-05-02 13:55:02,347: WARNING/MainProcess] self._store = self._destroy_open_corrupted_schedule(exc)
[2018-05-02 13:55:02,347: WARNING/MainProcess] File "/usr/local/lib/python2.7/site-packages/celery/beat.py", line 421, in _destroy_open_corrupted_schedule
[2018-05-02 13:55:02,347: WARNING/MainProcess] return self._open_schedule()
[2018-05-02 13:55:02,347: WARNING/MainProcess] File "/usr/local/lib/python2.7/site-packages/celery/beat.py", line 415, in _open_schedule
[2018-05-02 13:55:02,348: WARNING/MainProcess] return self.persistence.open(self.schedule_filename, writeback=True)
[2018-05-02 13:55:02,348: WARNING/MainProcess] File "/usr/local/lib/python2.7/shelve.py", line 243, in open
[2018-05-02 13:55:02,348: WARNING/MainProcess] return DbfilenameShelf(filename, flag, protocol, writeback)
[2018-05-02 13:55:02,348: WARNING/MainProcess] File "/usr/local/lib/python2.7/shelve.py", line 227, in __init__
[2018-05-02 13:55:02,348: WARNING/MainProcess] Shelf.__init__(self, anydbm.open(filename, flag), protocol, writeback)
[2018-05-02 13:55:02,348: WARNING/MainProcess] File "/usr/local/lib/python2.7/anydbm.py", line 85, in open
[2018-05-02 13:55:02,348: WARNING/MainProcess] return mod.open(file, flag, mode)
[2018-05-02 13:55:02,348: WARNING/MainProcess] File "/usr/local/lib/python2.7/dbhash.py", line 18, in open
[2018-05-02 13:55:02,349: WARNING/MainProcess] return bsddb.hashopen(file, flag, mode)
[2018-05-02 13:55:02,349: WARNING/MainProcess] File "/usr/local/lib/python2.7/bsddb/__init__.py", line 364, in hashopen
[2018-05-02 13:55:02,349: WARNING/MainProcess] d.open(file, db.DB_HASH, flags, mode)
[2018-05-02 13:55:02,349: WARNING/MainProcess] bsddb.db
[2018-05-02 13:55:02,349: WARNING/MainProcess] .
[2018-05-02 13:55:02,349: WARNING/MainProcess] DBFileExistsError
[2018-05-02 13:55:02,349: WARNING/MainProcess] :
[2018-05-02 13:55:02,349: WARNING/MainProcess] (17, 'File exists -- __fop_file_setup: Retry limit (100) exceeded')
通过查看celery代码,知道大概原因:
celery beat 在启动的时回去创建存储定时任务信息的数据库(参见shelve模块),但是该文件已存在,所以导致启动beat的时候报错, 解决办法是将该文件删除,然后重启beat即可。
db 文件为celerybeat-schedule