不用你说,AI 每天 6 点自动采集新闻、8 点发日报——这就是自动化的魅力。

An image to describe post


开篇:你的 AI 不应该只会“等你说话”

大多数人用 AI 的方式是这样的:想到什么,打开 App,问一句,等回答,关掉。

这没错,但这只发挥了 OpenClaw 10% 的潜力。

真正的效率革命,是让 AI 主动工作——在你睡觉时采集数据,在你吃早饭时发好日报,在你开会时完成备份。你不需要说任何话,它自己就干完了。

这就是 Cron 定时任务的核心价值:把你从“触发者”变成“结果接收者”。


什么是 Cron?

Cron 是 OpenClaw Gateway 内置的调度引擎。它的工作原理很简单:

  1. 你告诉它“什么时候”(调度时间)

  2. 你告诉它“做什么”(任务描述)

  3. 时间到了,Gateway 自动唤醒 AI,执行任务,把结果发给你

关键特性:

特性 说明
持久化存储 任务保存在 ~/.openclaw/cron/jobs.json,重启不丢失
隔离运行 每个任务在独立 session 中运行,不污染主会话
三种调度类型 at(一次性)、every(间隔)、cron(标准表达式)
灵活投递 结果可发送到 Telegram/Discord/Webhook,或静默执行
模型覆盖 每个任务可以单独指定模型,省钱神器

💡 Cron 运行在 Gateway 内部,不在模型内部。 这意味着即使你没有打开任何聊天窗口,Cron 任务也会准时执行。


Cron vs Heartbeat:选哪个?

很多人会混淆这两个概念,一张表说清楚:

Cron Heartbeat
触发时机 精确时间点(如 06:00) 周期性(如每 30 分钟)
适合场景 日报、定时提醒、月度报告 邮件巡检、状态监控
运行方式 独立 session(推荐)或主 session 在主 session 中
精确度 精确到分钟(整点有 0-5 分钟漂移) 依赖心跳间隔
一次性任务 ✅ 支持(at 类型) ❌ 不支持

选择原则:

  • “每天早上 9 点整发提醒” → 用 Cron

  • “每 30 分钟检查一次邮件” → 用 Heartbeat

  • “下周一开会前 1 小时提醒我” → 用 Cron(at 一次性)

⚠️ 整点漂移说明: 对于 0 * * * *0 */2 * * * 这类整点表达式,OpenClaw 会自动添加 0-5 分钟的随机延迟,以分散服务器负载。固定时间点(如 0 7 * * * 每天 7 点整)不受影响。如需完全精确,可设置 schedule.staggerMs: 0


三种调度类型详解

类型一:at — 一次性任务

在指定时间点执行一次,执行后自动删除。

# 20 分钟后执行一次
openclaw cron add \
  --name "快速提醒" \
  --at "20m" \
  --session main \
  --system-event "提醒:检查一下今天的会议安排"

# 指定具体时间(ISO 8601 格式)
openclaw cron add \
  --name "周一晨会提醒" \
  --at "2026-03-09T09:00:00+08:00" \
  --session main \
  --system-event "提醒:10 分钟后周一站立会议"

适用场景:

  • 临时提醒(“1 小时后提醒我回复那封邮件”)

  • 延迟执行的一次性任务

  • 测试和调试

类型二:every — 固定间隔

按固定时间间隔重复执行,语法比 Cron 表达式更直观。

# 每 4 小时检查一次项目状态
openclaw cron add \
  --name "项目健康检查" \
  --every "4h" \
  --session main \
  --system-event "项目健康检查:查看 GitHub Issues 和 PR 状态"

# 每 30 分钟执行
openclaw cron add --name "邮件检查" --every "30m" ...

常用间隔写法:30m(30 分钟)、2h(2 小时)、1d(1 天)

类型三:cron — 标准 Cron 表达式

最灵活的调度方式,支持复杂的时间规则。

# 每天早上 7 点生成晨报(指定时区)
openclaw cron add \
  --name "每日晨报" \
  --cron "0 7 * * *" \
  --tz "Asia/Shanghai" \
  --session isolated \
  --message "生成今日晨报:天气、日历、重要邮件摘要"

Cron 表达式速查

格式:分 时 日 月 周

需求 表达式 说明
每天 6 点 0 6 * * * 每天早上 6:00
工作日 8:30 30 8 * * 1-5 周一到周五 8:30
每 2 小时 0 */2 * * * 00:00, 02:00, 04:00...
每周一 9 点 0 9 * * 1 每周一早上 9:00
每月 1 号 0 点 0 0 1 * * 月初执行
每 15 分钟 */15 * * * * 频繁任务(慎用,成本高)

特殊符号:

符号 含义 示例
* 任意值 * * * * *(每分钟)
, 列表 0 9,12 * * *(9 点和 12 点)
- 范围 1-5(周一到周五)
/ 步长 */15(每 15 分钟)

时区配置(重要!)

Cron 默认使用 Gateway 所在机器的系统时区。如果你的服务器在海外(常见于 VPS),系统时区通常是 UTC,会导致任务时间偏差 8 小时。强烈建议显式指定时区:

openclaw cron add \
  --name "每日日报" \
  --cron "0 8 * * *" \
  --tz "Asia/Shanghai" \
  ...

常用时区:Asia/Shanghai(北京)、Asia/Tokyo(东京)、America/New_York(纽约)、Europe/London(伦敦)、UTC


核心概念:主 Session vs 隔离 Session

这是 Cron 最重要的设计决策,直接影响任务质量和主会话体验。

隔离 Session(推荐)

--session isolated

任务在独立的 cron:<jobId> session 中运行,不会污染你的主会话历史。

优点:

  • 主会话保持干净,不会被大量自动化日志淹没

  • 任务有独立上下文,不受主会话状态影响

  • 可以单独指定更便宜的模型

  • 支持直接投递(不需要唤醒主 Agent)

适合: 数据采集、日报生成、定期备份等“后台工作”

主 Session

--session main

任务通过 system-event 注入到主会话,AI 在下次心跳时处理。

优点:

  • 可以访问完整的主会话上下文和记忆

  • 任务结果自然融入对话历史

适合: 需要主会话上下文的提醒(如“提醒我继续昨天的任务”)

💡 经验之谈: 90% 的 Cron 任务用隔离 Session 就够了。只有当任务需要“记住上次聊天内容”时,才考虑主 Session。


创建 Cron 任务:两种方式

方式一:对话创建(最简单)

直接告诉 AI 你要什么,它会帮你创建:

你:每天早上 9 点提醒我开站立会议

AI:好的,我来创建 Cron 任务:
- 时间:每天 09:00(Asia/Shanghai)
- 任务:发送站立会议提醒
- Session:主 Session
- 投递:Telegram

确认创建吗?

你:确认

AI:✅ Cron 任务已创建(jobId: cron_standup_xxx)
下次执行:明天 09:00

方式二:CLI 命令(精确控制)

# 查看所有任务
openclaw cron list

# 创建隔离任务(推荐写法)
openclaw cron add \
  --name "daily-news" \
  --cron "0 6 * * 1-5" \
  --tz "Asia/Shanghai" \
  --session isolated \
  --message "采集 HN 热门文章并生成摘要" \
  --model "gemini-2.0-flash" \
  --deliver announce \
  --to "discord:#news"

# 手动立即触发(测试用)
openclaw cron run <job-id>

# 查看运行历史
openclaw cron runs --id <job-id>

# 编辑现有任务
openclaw cron edit <job-id> --model "gemini-2.0-flash"

# 删除任务
openclaw cron remove <job-id></job-id></job-id></job-id></job-id>

⚠️ 注意: 旧版文档中的 openclaw cron create 命令已更新为 openclaw cron add,请使用新命令。


实战案例:每日科技日报自动化