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

Django+Celery 5+环境下定时任务未执行排查求助(无报错日志)

Django+Celery 5+环境下定时任务未执行排查求助(无报错日志)

我最近搭了一套新的Django+Celery 5+环境(搭配Python 3.12+),遇到了一个百思不得其解的问题:所有配置看起来都没问题,依赖全装了,Django应用本身也没报错,但设置的每分钟执行一次的测试任务就是不运行,而且所有日志里完全找不到任何错误信息。

具体来说,我写了一个测试任务,用来每分钟记录当前时间到数据库和控制台,但既没看到数据库新增记录,也没在日志里看到打印的内容。下面是我的所有相关配置和代码,麻烦大家帮我看看哪里可能出了问题?


相关代码片段

tasks.py(位于company_dashboard应用下)

from celery import shared_task
from datetime import datetime
from .models import CeleLog

@shared_task
def get_all_weather_data():
    now = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    CeleLog.objects.create(content=f"Current time: {now}")
    print(f"Logged time: {now}")

settings.py(Django核心配置)

CELERY_BROKER_URL = 'amqp://localhost'
from celery.schedules import crontab

CELERY_BEAT_SCHEDULE = {
    'log-every-minute': {
        'task': 'company_dashboard.tasks.get_all_weather_data',  # 任务路径
        'schedule': crontab(minute='*/1'),
    },
}

celery.py(项目根目录)

import os
from celery import Celery
from django.conf import settings

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'app_rama.settings')
app = Celery('app_rama')
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

项目根目录__init__.py

from .celery import app as celery_app

Supervisor配置文件

app-celery-worker.conf

[program:app-celery-worker]
command=/home/app/bin/celery -A app_rama worker -l INFO
directory=/home/app/app
user=app
numprocs=1
stdout_logfile=/home/app/logs/app-rama-worker.log
stderr_logfile=/home/app/logs/app-rama-worker.log
autostart=true
autorestart=true
startsecs=10
stopwaitsecs=600
killasgroup=true
priority=998

app-celery-beat.conf

[program:app-celery-beat]
command=/home/app/bin/celery -A app_rama beat -l INFO
directory=/home/app/app
user=app
numprocs=1
stdout_logfile=/home/app/logs/app-rama-worker.log
stderr_logfile=/home/app/logs/app-rama-worker.log
autostart=true
autorestart=true
startsecs=10
stopwaitsecs=600
killasgroup=true
priority=998

我执行的启动命令

sudo supervisorctl reread
sudo supervisorctl update
sudo service nginx restart
sudo supervisorctl restart app
sudo supervisorctl start app-celery-worker
sudo supervisorctl start app-celery-beat

我的怀疑和排查方向

我初步怀疑可能是Celery 5+的启动方式和旧版本有差异,或者某些配置细节没注意到,想请教大家这些排查点是否正确,还有什么遗漏的地方:

  1. 确认Celery Beat进程是否真的在运行
    定时任务完全由Beat调度,哪怕Worker正常运行,Beat没起来的话任务也不会触发。可以用ps aux | grep celery查看系统进程,确认是否存在celery beat进程。另外你现在把Beat和Worker的日志写到同一个文件,建议分开成单独的Beat日志,方便排查调度情况。

  2. 检查定时任务的路径是否完全正确
    你在CELERY_BEAT_SCHEDULE里写的任务路径是company_dashboard.tasks.get_all_weather_data,要确认:

    • company_dashboard是否已添加到settings.INSTALLED_APPS中?
    • 任务的完整路径是否需要包含项目名?比如是不是应该写成app_rama.company_dashboard.tasks.get_all_weather_data?
      可以手动调用任务测试:celery -A app_rama call company_dashboard.tasks.get_all_weather_data,如果路径错误会直接报错。
  3. 验证Broker(RabbitMQ)的连接状态
    虽然日志没报错,但RabbitMQ可能未启动或Celery未成功连接。可以用rabbitmqctl status检查RabbitMQ服务状态,再查看Worker日志里是否有Connected to amqp://guest@localhost:5672//这类连接成功的信息。

  4. 手动启动Beat查看调试日志
    暂时停掉Supervisor管理的Beat进程,手动用调试级别启动:celery -A app_rama beat -l DEBUG,查看是否加载到了log-every-minute这个定时任务,以及是否有每分钟调度任务的记录。

  5. 确认Celery是否自动发现了任务
    查看Worker启动日志,是否有类似Loaded tasks: ['company_dashboard.tasks.get_all_weather_data', ...]的内容。如果没有,说明autodiscover_tasks没找到你的tasks.py,可能是应用未加入INSTALLED_APPS,或者文件名不符合要求(必须是tasks.py)。

  6. 检查Supervisor的虚拟环境路径
    你在command里用的/home/app/bin/celery是否是虚拟环境内的可执行文件?可以手动切换到app用户,进入虚拟环境执行启动命令,确认路径和环境变量是否正常。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 09:58:03