OpenClaw实战教程系列第07篇 - 定时任务 Cron:让 AI 自己干活
不用你说,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,请使用新命令。
实战案例:每日科技日报自动化
这是我实际运行的完整 Cron 任务链,每天自动采集和发布科技日报,月成本约 $2.7。
任务 1:数据采集(06:00,隔离 Session)
openclaw cron add \
--name "采集每日科技资讯" \
--cron "0 6 * * *" \
--tz "Asia/Shanghai" \
--session isolated \
--model "gemini-2.0-flash" \
--message "执行以下任务:
1. 使用 web_search 搜索 'Hacker News 热门',获取 Top 10
2. 使用 web_search 搜索 'Product Hunt 今日热门',获取 Top 5
3. 使用 web_search 搜索今日重要科技新闻
4. 将结果保存到 ~/Daily/raw/$(date +%Y-%m-%d).json
5. 简单总结采集了多少条内容" \
--deliver announce \
--to "telegram"
为什么用 Gemini Flash?采集任务不需要复杂推理,Flash 完全够用,价格 $0.075/百万 token,比 Sonnet 便宜 40 倍,每次成本约 $0.01,一个月 $0.30。
任务 2:生成日报(08:30,隔离 Session)
openclaw cron add \
--name "生成科技日报" \
--cron "30 8 * * *" \
--tz "Asia/Shanghai" \
--session isolated \
--model "claude-3-5-sonnet-20241022" \
--message "执行以下任务:
1. 读取 ~/Daily/raw/$(date +%Y-%m-%d).json
2. 分析所有采集的内容
3. 精选 8-10 条最有价值的科技新闻
4. 为每条新闻写中文摘要(50-100 字)
5. 生成完整 Markdown 日报,包含标题、日期、新闻列表
6. 保存到 ~/Daily/digest/$(date +%Y-%m-%d).md
7. 报告发布结果和本次成本" \
--deliver announce \
--to "telegram"
完整流程图
06:00 ─── Cron 触发(Gemini Flash)
│
▼
采集数据
- HN Top 10
- PH Top 5
- 科技新闻
│
▼
保存原始数据
~/Daily/raw/
│
等待 2.5 小时
│
08:30 ─── Cron 触发(Claude Sonnet)
│
▼
读取 + 分析数据
│
▼
生成精选日报
- 8-10 条新闻
- 中文摘要
│
▼
保存 + 发布
│
▼
Telegram 通知
"📰 日报已发布"
成本分析
| 任务 | 模型 | 单次成本 | 月度成本(30 天) |
|---|---|---|---|
| 采集 | Gemini Flash | ~$0.01 | ~$0.30 |
| 生成 | Claude Sonnet | ~$0.08 | ~$2.40 |
| 总计 | - | ~$0.09 | ~$2.70 |
对比:如果全程用 Claude Opus → 月度成本约 $15,节省 82%。
投递模式详解
announce:发送到聊天渠道
最常用的模式,将任务结果发送到 Telegram/Discord/iMessage 等。
--deliver announce --to "telegram"
--deliver announce --to "discord:#news"
--deliver announce --to "telegram:group:@mygroup"
效果示例:
📰 日报生成完成!
- 采集:23 条内容
- 精选:8 条核心新闻
- 发布:https://quaily.com/x/xxx
- 耗时:3 分钟
- 成本:$0.12
💡 重要: 隔离 Session 的 Cron 任务默认投递模式就是 announce。结果直接通过渠道适配器发出,不需要唤醒主 Agent,速度更快。
webhook:POST 到指定 URL
将结果推送到外部系统,适合集成自己的应用。
openclaw cron add \
--name "数据推送" \
--cron "0 9 * * *" \
--session isolated \
--message "生成今日报告" \
--deliver webhook \
--to "https://myapp.com/api/openclaw-webhook"
适用场景:推送到自己的数据库、触发 CI/CD 流程、发送到企业微信/钉钉/飞书机器人。
none:静默执行
不发送任何通知,任务静默完成。
--deliver none
适用场景:数据备份任务、任务链的中间步骤、不需要人工关注的例行任务。
模型选择策略:省钱的关键
Cron 任务的核心原则:重复性任务 = 成本敏感 = 能便宜就便宜。
| 任务类型 | 推荐模型 | 理由 |
|---|---|---|
| 数据采集 | Gemini Flash | 便宜、速度快、不需要复杂推理 |
| 简单提醒 | Gemini Flash | 超便宜,提示类任务完全够用 |
| 数据处理 | Claude Sonnet | 性价比高、能理解上下文 |
| 内容生成 | Claude Sonnet | 写作质量好、中文表现好 |
| 复杂分析 | Claude Opus | 最强推理,只在关键决策时用 |
⚠️ 踩坑实录:别用 Opus 跑高频 Cron!
曾经犯过一个代价惨重的错误:用 Opus 跑每 2 小时一次的邮件检查任务。结果:一天跑 12 次,每次 $0.50,一天 $6,一个月 $180!改用 Gemini Flash 后,每次 $0.005,一个月 $1.8,节省 99%。
省钱三原则:
-
Cron 任务默认用 Gemini Flash,除非有明确理由用更贵的
-
只有“需要写作/复杂推理”的任务才升级到 Sonnet
-
Opus 只用于主会话的深度对话,绝不用于自动化任务
管理 Cron 任务
# 查看所有任务(含状态、下次执行时间)
openclaw cron list
# 手动立即触发(测试用,不等调度时间)
openclaw cron run <job-id>
# 查看某个任务的运行历史
openclaw cron runs --id <job-id>
# 编辑任务(修改模型、调度时间等)
openclaw cron edit <job-id> --model "gemini-2.0-flash"
openclaw cron edit <job-id> --cron "0 7 * * *"
# 删除任务
openclaw cron remove <job-id></job-id></job-id></job-id></job-id></job-id>
💡 直接告诉 AI 管理任务是最方便的方式。 比如:“帮我把采集任务改成每天 5 点执行”,AI 会自动调用 cron 工具完成修改。
故障排除
Q1:Cron 任务没执行?
# 1. 查看任务列表,确认任务存在且未禁用
openclaw cron list
# 2. 检查系统时间和时区
date
# 如果时区不对,在任务中显式指定 --tz "Asia/Shanghai"
# 3. 查看运行历史
openclaw cron runs --id <job-id>
# 4. 手动触发测试
openclaw cron run <job-id></job-id></job-id>
常见原因:
-
忘记指定时区,服务器是 UTC 时间(VPS 用户高发)
-
Gateway 没有运行(Cron 运行在 Gateway 内部,Gateway 停了任务也停)
-
任务被自动禁用(执行失败后会进入指数退避:30s → 1m → 5m → 15m → 60m)
Q2:任务执行了但没收到结果?
-
announce 模式:检查
--to字段是否正确,确认 AI 有发送消息到该渠道的权限 -
webhook 模式:测试 Webhook URL 是否可访问,检查是否需要认证 header
-
none 模式:确认你确实设置了静默模式,通过查看文件是否生成来验证
Q3:任务超时?
默认超时较短,复杂任务需要更长时间。建议拆分任务:
# 大任务拆成多个小任务
# 任务 A(06:00):采集数据 → 保存到 data/raw.json
# 任务 B(07:00):读取 raw.json → 分析 → 保存到 data/analysis.json
# 任务 C(08:00):读取 analysis.json → 生成报告 → 发布
Q4:任务执行报错?
# 查看详细运行日志
openclaw cron runs --id <job-id></job-id>
常见错误:
-
模型不可用:检查 API Key 是否有该模型的权限
-
工具被禁用:检查
openclaw.json的tools配置 -
文件权限:AI 是否有权限读写指定目录
高级技巧
技巧 1:任务链(通过文件传递数据)
把复杂流程拆成多个 Cron 任务,中间结果保存到文件:
任务 A(06:00):采集数据 → 保存 data/raw.json
任务 B(07:00):读取 raw.json → 分析 → 保存 data/analysis.json
任务 C(08:00):读取 analysis.json → 生成报告 → 发布
优点:每个任务职责单一,出错容易定位;可以用不同模型处理不同阶段。
技巧 2:条件执行(在 Prompt 中加判断)
读取 ~/Daily/raw/$(date +%Y-%m-%d).json
如果数据量 < 10 条:
发送通知"数据不足,跳过今日日报"
结束任务
否则:
继续生成日报
技巧 3:一次性提醒(at 类型)
openclaw cron add \
--name "邮件提醒" \
--at "1h" \
--session main \
--system-event "提醒:回复 John 关于项目报价的邮件" \
--delete-after-run
--delete-after-run 确保执行后自动清理,不留垃圾任务。
技巧 4:Webhook 集成企业工具
openclaw cron add \
--name "飞书日报推送" \
--cron "0 9 * * 1-5" \
--tz "Asia/Shanghai" \
--session isolated \
--message "生成今日工作日报" \
--deliver webhook \
--to "https://open.feishu.cn/open-apis/bot/v2/hook/YOUR_TOKEN"
验证清单
确认 Cron 系统正常工作:
-
创建了一个测试 Cron 任务(用
--at "5m"5 分钟后执行) -
任务按时执行了(用
openclaw cron runs --id <id>确认) -
收到了投递结果(announce/webhook/none 按预期工作)
-
检查了任务成本(确认用的是便宜模型)
-
测试了手动触发(
openclaw cron run <id>) -
测试了编辑功能(
openclaw cron edit <id> ...) -
测试了删除功能(
openclaw cron remove <id>) -
时区配置正确(显式指定了
--tz)
本篇小结
核心要点:
-
三种调度类型:
at(一次性)、every(间隔)、cron(表达式),覆盖所有场景 -
隔离 Session 是默认最佳选择:不污染主会话,速度快,可单独指定模型
-
模型选择决定成本:Cron 任务优先用 Gemini Flash,省钱 40-100 倍
-
整点漂移是正常现象:整点表达式有 0-5 分钟漂移,固定时间点不受影响
-
任务链是复杂自动化的最佳实践:拆分任务,各司其职,出错好排查
下一步
Cron 让你能在精确时间点执行任务,但它只是被动等待时间点。下一篇教你如何让 AI 主动巡检:
→ 第 08 篇 | 心跳机制 Heartbeat — 让 AI 每 30 分钟主动检查邮件、日历、系统健康,有问题立即通知你。
💬 读者讨论
你最想自动化什么任务?日报?周报?定时备份?还是别的什么?
欢迎在评论区分享!加入读者微信群 saga-su(备注 OpenClaw)。
📚 本系列目录
-
第 01 篇:OpenClaw 是什么?
-
第 02 篇:5 分钟安装指南
-
第 03 篇:连接你的第一个聊天渠道
-
第 04 篇:个性化你的 AI
-
第 05 篇:记忆系统
-
第 06 篇:工具调用与 Skills
-
第 07 篇:定时任务 Cron(你在这里)
-
第 08 篇:心跳机制 Heartbeat
-
查看完整目录
下一篇预告:Heartbeat 心跳机制,让 AI 在空闲时主动检查你的世界——邮件、日历、GitHub、系统健康,像一位尽职的管家。