设定时间后,芹菜节拍不发送 crontab 任务

Celery beat not sending crontab task when hour is set

我使用的是 celery 4.1,除了我在 crontab 任务中设置时间的地方,我的所有周期性任务都正常工作。我一直以为是时区设置的问题,但我似乎无法弄清楚问题出在哪里。

dashboard/celery.py

from __future__ import absolute_import, unicode_literals
from celery import Celery

app = Celery('dashboard',
         broker='redis://',
         backend='redis://localhost',
         include=['dashboard.tasks'])

app.conf.update(
    result_expires=3600,
    enable_utc = False,
    timezone = 'America/New_York'
)


if __name__ == '__main__':
    app.start()

这个有效:

@app.task
@periodic_task(run_every=(crontab()))
def shutdown_vms():
    inst = C2CManage(['stop','kube'])
    inst.run()
    return

这个有效:

@app.task
@periodic_task(run_every=(crontab(minute=30,hour='*')))
def shutdown_vms():
    inst = C2CManage(['stop','kube'])
    inst.run()
    return

这行不通:

@app.task
@periodic_task(run_every=(crontab(minute=30,hour=6)))
def shutdown_vms():
    inst = C2CManage(['stop','kube'])
    inst.run()
    return

Beat接任务就好了:

<ScheduleEntry: dashboard.tasks.shutdown_vms dashboard.tasks.shutdown_vms() <crontab: 30 6 * * * (m/h/d/dM/MY)>

但它从未发送过。我已经让进程 运行 一个周末了,但它从未提交任务。我不知道我做错了什么。我确实有其他任务 运行 在 timedelta 周期性上,它们都工作得很好。

任何帮助都会很棒。

编辑:主机设置为使用 America/New_York 时区。

EDIT2:运行将节拍作为一个单独的过程:

celery -A dashboard worker -l info

celery -A dashboard beat -l debug

我 运行 他们大多分离或使用 multi。

看起来是这个错误导致的。

https://github.com/celery/celery/issues/4177

还有其他几个表明在不使用 UTC 时无法正确计算调度。

将 celery 切换为使用 UTC 作为时区并启用了 utc,它工作正常。

我用celery==4.0.1解决了这个问题

问题的简单解决方案是

在芹菜设置中更新以下配置

app.conf.enable_utc = False
app.conf.timezone = "Asia/Calcutta"