首页 > ODOO > 正文

Odoo 定时任务不执行怎么办?cron 排查指南

fenij 2026-07-31 11 ODOO

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.confdbfilter 没配,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 里给重任务调大间隔,或者拆成多个小任务错峰执行。