EC2 Ubuntu环境下使用Django-Crontab:定时任务运行但ORM无数据存储
核心高频问题定位
执行目标文件错配(占此类问题90%以上)
当前配置的cron规则指向/home/ubuntu/web-coin-crawler/webcoincrawler/cron.crontab,该文件是Django-Crontab模块存储任务规则的纯文本配置文件,本身不包含可执行的Python爬取、入库逻辑。你实现了crontab()爬取、ORM存数逻辑的文件是对应的cron.py,就算定时任务每30分钟准时触发,实际执行的也是无意义的文本配置内容,根本不会触发数据库写入流程。
修正方向:将cron执行目标替换为实际的Python逻辑入口,可直接采用Django Shell内联调用的方式配置规则,示例:*/30 * * * * cd /home/ubuntu/web-coin-crawler && /home/ubuntu/web-coin-crawler/venv/bin/python3 -c "import os; os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings'); import django; django.setup(); from webcoincrawler.cron import crontab; crontab()"cron环境上下文缺失导致的静默报错
cron执行流程不会加载用户目录下.bashrc、.profile中的自定义环境变量,也不会自动切换到项目工作目录,所有执行异常都会被静默吞掉,不会主动弹出报错提示。常见的上下文问题包括:- 工作目录不匹配:cron默认执行路径为
/home/ubuntu,会导致本地编写的爬虫依赖模块(crawl_coinmarketcal、crawl_coinscalendar)导入失败 - 环境变量缺失:数据库连接参数、爬虫代理配置等依赖自定义环境变量的配置项读取失败,导致ORM连接数据库超时、爬虫请求被拦截
排查方法:给cron规则增加日志重定向,将所有标准输出、错误输出写入本地日志文件,示例:
*/30 * * * * cd /home/ubuntu/web-coin-crawler && /home/ubuntu/web-coin-crawler/venv/bin/python3 你的逻辑入口脚本 >> /home/ubuntu/crawl_cron.log 2>&1连续执行2轮任务后直接查看
/home/ubuntu/crawl_cron.log,即可定位具体的模块导入失败、权限不足、数据库连接报错等问题。- 工作目录不匹配:cron默认执行路径为
逻辑层面的空值问题排查
就算脚本执行路径正确,也可能存在无数据可入库的情况:
- 两个爬虫站点的爬取逻辑返回空结果,预处理后生成的JSON内容为空,虽然触发了
save()方法,但实际写入的是空值内容 BlogData模型对title字段设置了唯一约束,首次写入title="COIN_DATA"的记录后,后续所有定时任务的save()操作都会触发唯一键冲突报错,因没有日志输出无法感知该异常,表现为“无新数据入库”
合规使用Django-Crontab的正确姿势
如果采用Django-Crontab模块实现定时任务,无需手写裸cron规则,可直接在项目settings.py中配置任务列表,通过python manage.py crontab add自动生成适配EC2 Ubuntu环境的cron规则,模块会自动处理工作目录、Python虚拟环境路径的兼容问题,避免路径错配。基础配置示例:
CRONJOBS = [ ('*/30 * * * *', 'webcoincrawler.cron.crontab', '>> /home/ubuntu/web-coin-crawler/logs/cron_exec.log 2>&1') ]
内容的提问来源于stack exchange,提问作者mo_young

