Celery crontab每分钟任务正常 每日12:30定时任务不运行求排查方案
Celery 每日定时任务未触发排查解决方案
1. 时区配置排查(最高发原因)
Celery Beat 默认使用UTC时区,若你配置的时间为本地时区时间,会出现时间差导致任务不在预期时间触发。比如东八区时间比UTC快8小时,你配置的UTC 12:25对应东八区20:25,自然不会在中午12点多运行。
- 在Celery配置文件中添加时区配置(以东八区为例):
from celery.schedules import crontab # 新增时区配置 CELERY_TIMEZONE = 'Asia/Shanghai' CELERY_ENABLE_UTC = False CELERY_BEAT_SCHEDULE = { 'task-second': { 'task': 'app1.tasks.add_schedular', 'schedule': crontab(minute='*/1'), }, 'mail-check': { 'task': 'app1.tasks.mail_schedular', 'schedule': crontab(hour=12,minute=30), # 注意你原配置写的是25,如需12:30执行需修改为30 } }
- 修改配置后必须重启Celery Beat进程才可生效,仅重启worker进程不生效。
2. 进程运行状态检查
每分钟任务正常仅能说明worker服务运行正常,无法证明Beat调度服务正常:
- 执行命令检查Beat进程是否存活:
ps aux | grep celery | grep beat - 若进程不存在,使用带日志的启动命令重启Beat:
celery -A 你的项目主模块名 beat -l info - 查看启动后的Beat日志,可以直接看到每个任务的下一次调度时间,确认是否符合你的预期。如果日志中能看到
mail-check任务的调度记录,说明任务已经被触发,是执行阶段出了问题。
3. 任务可用性校验
- 确认
app1.tasks.mail_schedular的任务导入路径完全正确,无拼写错误,和任务注册时的名称完全一致。 - 手动调用任务验证是否能正常运行,排除任务本身报错导致的"看起来没触发"问题:
from app1.tasks import mail_schedular # 异步调用任务 mail_schedular.delay()
- 查看Celery worker的运行日志,确认是否有任务执行报错的记录,比如依赖缺失、权限不足、数据库连接失败等问题都会导致任务执行失败但无明显提示。
4. 配置冲突排查
- 检查项目中是否有其他位置覆盖了
CELERY_BEAT_SCHEDULE配置,导致你的定时任务没有被实际加载。 - 如果你使用了Django + django-celery-beat的动态调度方案,静态配置的定时任务会被数据库中的动态配置覆盖,需要在后台管理页面添加对应定时任务才可生效。
- 确认没有多套Beat进程同时运行,避免调度冲突。
内容的提问来源于stack exchange,提问作者Rana
相关产品推荐
相关产品推荐

