You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 15:48:01