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+的启动方式和旧版本有差异,或者某些配置细节没注意到,想请教大家这些排查点是否正确,还有什么遗漏的地方:
确认Celery Beat进程是否真的在运行
定时任务完全由Beat调度,哪怕Worker正常运行,Beat没起来的话任务也不会触发。可以用ps aux | grep celery查看系统进程,确认是否存在celery beat进程。另外你现在把Beat和Worker的日志写到同一个文件,建议分开成单独的Beat日志,方便排查调度情况。检查定时任务的路径是否完全正确
你在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,如果路径错误会直接报错。
验证Broker(RabbitMQ)的连接状态
虽然日志没报错,但RabbitMQ可能未启动或Celery未成功连接。可以用rabbitmqctl status检查RabbitMQ服务状态,再查看Worker日志里是否有Connected to amqp://guest@localhost:5672//这类连接成功的信息。手动启动Beat查看调试日志
暂时停掉Supervisor管理的Beat进程,手动用调试级别启动:celery -A app_rama beat -l DEBUG,查看是否加载到了log-every-minute这个定时任务,以及是否有每分钟调度任务的记录。确认Celery是否自动发现了任务
查看Worker启动日志,是否有类似Loaded tasks: ['company_dashboard.tasks.get_all_weather_data', ...]的内容。如果没有,说明autodiscover_tasks没找到你的tasks.py,可能是应用未加入INSTALLED_APPS,或者文件名不符合要求(必须是tasks.py)。检查Supervisor的虚拟环境路径
你在command里用的/home/app/bin/celery是否是虚拟环境内的可执行文件?可以手动切换到app用户,进入虚拟环境执行启动命令,确认路径和环境变量是否正常。
内容来源于stack exchange

