Odoo 的定时任务(Scheduled Actions)不跑了,邮件队列不发、自动确认单不生成、报告不导出——这类问题在 Odoo 部署里很常见。根因往往不在 Odoo 本身,而在系统 cron 配置或者数据库里的 ir.cron 记录。下面按排查顺序来。
第一步:确认系统 cron 在跑
Odoo 的定时任务依赖系统 cron 调用 /odoo/odoo-bin cron 或者通过配置文件中的 cron_thread。先检查系统层面:
systemctl status cron
# 或者
crontab -l -u odoo
如果是用 crontab 配置的,应该看到类似这行:
* * * * * /odoo/odoo-bin cron --config=/etc/odoo/odoo.conf >/dev/null 2>&1
如果 crontab 是空的,那定时任务根本没被调度。加上这行,重启 cron 服务:systemctl restart cron。
如果你是用 systemd 管理的 Odoo,检查服务文件里有没有把 cron 模式开起来。有些部署只启动了 HTTP worker,没有单独的 cron worker。
第二步:看 Odoo 日志
定时任务每次执行都会在日志里留记录。看最近的 cron 相关日志:
grep -i cron /var/log/odoo/odoo-server.log | tail -50
正常情况下每分钟会有一行类似 odoo.addons.base.cron: starting cron 的输出。如果完全没有,说明 cron 进程没在运行,回到第一步。
如果有报错,看具体是什么。常见的:
- 数据库连接超时 — 连接池满了,cron 任务拿不到连接
- 某个模块的方法报了异常 — 整个 cron 批次中断
- 锁未释放 — 上次任务异常退出,ir.cron 记录还持有锁
第三步:检查 ir.cron 记录
到 Odoo 后台,设置 → 技术 → 调度 → 计划动作(Settings → Technical → Scheduled Actions)。找到不工作的那个任务,检查几个字段:
间隔数字和单位:比如间隔数字填了 0,或者单位选了「年」但你以为是一天。
下次执行时间:如果这个时间是过去的日期,说明任务积压了。Odoo 会在下次 cron tick 时补执行,但如果积压太多,可能需要手动重置。
激活状态:确认「活跃」勾上了。这个字段偶尔会被误取消。
调用的模型和方法:确认目标模型确实有这个方法,且方法签名没有变(升级模块后方法重命名了但 cron 还在调旧名字)。
第四步:处理锁卡死
Odoo 的 cron 执行时会给 ir.cron 记录加锁。如果任务执行到一半进程被 kill,锁不会自动释放,后面的调度会认为任务还在跑而跳过。
在数据库里检查:
SELECT id, name, cron_name, active, nextcall, state FROM ir_cron WHERE cron_name = '你的任务名';
如果 state 不是 code 而是别的值,或者 nextcall 停在过去的时间不动,大概率是卡住了。手动重置:
UPDATE ir_cron SET state = 'code', nextcall = NOW() WHERE cron_name = '你的任务名';
然后重启 Odoo 服务让 cron tick 重新拾起这个任务。
第五步:手动触发测试
在后台的计划动作列表里,选中任务,点「Run Manually」按钮。看日志里有没有报错。如果手动触发也失败,问题就在任务调用的方法本身——可能是依赖的模块没装、方法的参数变了、或者外部服务(比如邮件服务器)连不上。
如果是邮件发送类的定时任务,先在 Odoo 里手动发一封测试邮件,确认 SMTP 配置没问题。
常见踩坑点
升级 Odoo 版本后 cron 不跑:大版本升级时数据库迁移可能改了 ir_cron 的表结构或者字段名。跑一遍 odoo-bin -d your_db --upgrade=all 确保表结构是最新的。
多数据库环境:如果 odoo.conf 里 dbfilter 没配,cron 进程可能不知道该操作哪个数据库。加上 dbfilter = ^your_db$。
内存不足:小内存 VPS 上 Odoo cron 跑大批量任务(比如几千封邮件队列)可能 OOM。看 dmesg 里有没有 OOM killer 记录。
更多 Odoo 运维教程,请访问 fenij.com。
常见问题
问:cron 日志显示在跑但任务没效果?
答:看任务调用的方法有没有被模块升级改掉了签名。在后台手动触发这个任务,看日志报错。如果是方法不存在,升级对应模块或者修正 ir.cron 里调用的方法名。
问:重启 Odoo 后定时任务开始跑了,但过几个小时又停了?
答:大概率是内存不够,cron 进程被 OOM killer 干掉了。运行 dmesg | grep -i oom 确认。增加 swap 或者给 Odoo 分配更多内存。
问:多个 cron 任务同时跑导致数据库锁冲突?
答:Odoo 默认串行执行 cron 任务,但如果某个任务执行时间超过一个 cron tick,后面的会积压。在 ir.cron 里给重任务调大间隔,或者拆成多个小任务错峰执行。