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

开篇:你的 AI 不应该只会“等你说话”
大多数人用 AI 的方式是这样的:想到什么,打开 App,问一句,等回答,关掉。
这没错,但这只发挥了 OpenClaw 10% 的潜力。
真正的效率革命,是让 AI 主动工作——在你睡觉时采集数据,在你吃早饭时发好日报,在你开会时完成备份。你不需要说任何话,它自己就干完了。
这就是 Cron 定时任务的核心价值:把你从“触发者”变成“结果接收者”。
什么是 Cron?
Cron 是 OpenClaw Gateway 内置的调度引擎。它的工作原理很简单:
-
你告诉它“什么时候”(调度时间)
-
你告诉它“做什么”(任务描述)
-
时间到了,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,请使用新命令。