背景
在進行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=