跟我一起学 OpenClaw(04):Cron、Heartbeat 与自动化——让 AI 在你不说话时持续产出
跟我一起学 OpenClaw(04):Cron、Heartbeat 与自动化——让 AI 在你不说话时持续产出
前言
前三篇我们完成了这些:
- 第 1 篇:理解 OpenClaw 的核心(Gateway / Sessions / Tools & Skills)
- 第 2 篇:跑通 Agent 配置与工作流(以飞书接入为例)
- 第 3 篇:进入工程化(插件与技能体系、allowlist 稳定策略)
这篇我们讨论一个对长期运营 AI 系统至关重要的话题:自动化与调度。
因为你会遇到这样的场景:
我不想每次都手动启动任务。我想让 Agent 在后台"该干活时干活",无需我操控。
这就涉及两个系统:
- Cron - 精确时间触发(“每天 9:00 AM”、“每周一早上”)
- Heartbeat - 周期性巡检(“每 30 分钟检查一次”)
两者都能让 AI 系统"活起来",但场景和设计完全不同。这篇会讲清楚什么时候用哪个,以及怎么避免常见的"任务堆积"问题。
1. Cron vs Heartbeat:先明确使用场景
Cron:精确时间触发
Cron 的特点:
- 时间必须准(“9:00 AM 不能早也不能晚”)
- 一次触发独立执行(隔离会话)
- 支持复杂的时间规则(RRULE、timezone)
- 适合:定时报告、定时备份、定时清理
配置示例(概念性):
{
"schedule": { "kind": "cron", "expr": "0 9 * * *", "tz": "Asia/Shanghai" },
"payload": { "kind": "agentTurn", "message": "生成今日工作摘要" },
"delivery": { "mode": "announce", "channel": "feishu", "to": "ou_xxx" }
}
典型场景:
- 每天 9:00 AM 生成日报
- 每周五 17:00 生成周报
- 每月 1 日 0:00 清理过期数据
Heartbeat:周期性巡检(有状态的)
Heartbeat 的特点:
- 时间可以漂移(30 分钟左右,不要求秒级准时)
- 与主会话共享历史(能读主会话的记忆)
- 适合:定期检查、内存刷新、状态核验
- 配置在
HEARTBEAT.md里,不走 cron
配置示例(写到 WORKSPACE/HEARTBEAT.md):
# 每次 heartbeat 检查这些(2-3 个/次,轮转)
## 电子邮件
- 查看未读邮件数
- 提醒重要邮件
## 日历
- 今天有没有会议(<2h)
- 明天有没有重要事件
## 社交
- Twitter/社媒新通知
典型场景:
- 与用户实时共享状态(“你有 3 条新邮件”)
- 定期做内存维护(向量化、去重)
- 周期性提醒
2. 为什么要分开:时间精度 vs 会话连续性的权衡
Cron 的优势(隔离)
┌─────────────────────────┐
│ 主会话(你和 Agent) │
│ - 用户实时操作 │
│ - 可能很忙或暂停 │
└─────────────────────────┘
↓
┌─────────────────────────┐
│ 独立 Cron 任务 │
│ - 精确 9:00 AM 触发 │
│ - 独立会话,不阻塞主会话
│ - 完成后直接 announce │
└─────────────────────────┘
好处:
- 不会被主会话的"忙"打断(e.g., 你在复杂推理时,定时任务也能触发)
- 不浪费主会话的 token budget
- 失败不会波及主会话
Heartbeat 的优势(连续性)
┌─────────────────────────┐
│ 主会话 │
│ - 接收用户消息 │
│ - 定期触发 heartbeat │
│ - Heartbeat 可以读会话 │
│ 历史、更新 MEMORY.md │
└─────────────────────────┘
好处:
- Heartbeat 能访问主会话的对话历史(适合"记忆维护")
- 成本低(没有新会话开销)
- 与用户的工作流紧密绑定
3. Cron 实战:一个真实的例子
假设你要:每周一 9:00 AM 生成上周 OpenClaw 运营数据报告,发到飞书。
步骤 1:写报告生成的 prompt
你是 OpenClaw 运营分析员。生成一份精炼的周报,包括:
- 上周 Cron 任务执行情况(成功/失败率)
- 平均会话时长
- 使用最频繁的插件/技能排序
- 下周预期(基于趋势)
格式:Markdown 表格 + 关键数字。
步骤 2:配置 Cron 任务
用 gateway cron add 或在配置文件里写:
{
"name": "weekly-report",
"schedule": {
"kind": "cron",
"expr": "0 9 * * 1",
"tz": "Asia/Shanghai"
},
"payload": {
"kind": "agentTurn",
"message": "生成上周 OpenClaw 运营报告"
},
"delivery": {
"mode": "announce",
"channel": "feishu",
"to": "ou_xxxxx"
},
"sessionTarget": "isolated"
}
字段解释:
expr: "0 9 * * 1"= 每周一(1)9:00 AM(0 9)sessionTarget: "isolated"= 用独立会话(不消耗主会话 token)delivery.mode: "announce"= 完成后自动发飞书
步骤 3:监控执行
openclaw cron list
openclaw cron runs <job-id> --limit 10
查看最近 10 次执行,检查有没有失败。
4. Heartbeat 实战:内存维护
假设你要:每天 3 次自动检查邮件和日历,有重要事项就通知我。
步骤 1:配置 HEARTBEAT.md
在 workspace 的 HEARTBEAT.md 里写:
# Heartbeat 检查清单(轮转每次 2-3 项)
## 电子邮件
- [ ] 查看未读数
- [ ] 标记重要邮件
## 日历
- [ ] 今天 <2h 内有会议吗
- [ ] 明天有重要事件吗
## 社交
- [ ] Twitter 新通知
步骤 2:系统自动触发
OpenClaw 会根据配置(例如每 30 分钟)自动触发 heartbeat。heartbeat 会:
- 读
HEARTBEAT.md - 轮转选择 2-3 项执行
- 如果发现"重要"则通知你
- 更新内存
不需要 Cron 配置,系统内置。
步骤 3:自定义规则
Heartbeat 逻辑可以进阶:
# 伪代码示例
def heartbeat_logic():
items = load_checklist("HEARTBEAT.md")
# 轮转:选择这次没检查过的 2 项
batch = rotate_items(items, rotate_key="last_heartbeat_index")
for item in batch:
result = execute(item)
if result.is_critical:
notify_user(result)
update_memory("上次检查了什么,有什么发现")
5. 常见坑与解决方案
坑 1:任务堆积(Cron 超时)
问题:
- Cron 每小时触发一次,每次需要 5 分钟
- 但第一个还没完成,第二个就来了
- 导致任务堆积、Gateway 爆炸
解决:
- 先检查任务时长(加 timeout)
- 调整触发间隔(改成 15 分钟触发一次)
- 监控执行队列(
cron runs看堆积情况)
坑 2:Heartbeat 频繁刷新内存导致成本上升
问题:
- Heartbeat 每次都要读 MEMORY.md
- MEMORY.md 太大(100KB+)
- 多次 heartbeat = token 浪费
解决:
- 定期清理 MEMORY.md(删除过期条目)
- 分离到向量库(用 memory-lancedb 插件做向量搜索)
- 降低 heartbeat 频率(从 30 分钟改 60 分钟)
坑 3:timezone 配置错误
问题:
"expr": "0 9 * * 1",
"tz": "UTC" # ← 错的!
# 结果:实际是 17:00 GMT+8 触发,不是 9:00
解决:
"tz": "Asia/Shanghai" # ← 对的
6. 集成案例:每天自动写工作日志
把 Cron + Heartbeat 组合起来的完整例子。
需求:
- 每天 20:00(Cron):触发"总结今天"
- 期间任何时候(Heartbeat):如果看到重要提醒则通知
配置:
Cron 部分(每天 20:00)
{
"name": "daily-standup",
"schedule": { "kind": "cron", "expr": "0 20 * * *", "tz": "Asia/Shanghai" },
"payload": {
"kind": "agentTurn",
"message": "基于今天的对话记录,生成一份 100 字日志(完成了什么、遇到的问题、明天计划)"
},
"delivery": { "mode": "announce", "channel": "feishu", "to": "ou_xxx" },
"sessionTarget": "isolated"
}
Heartbeat 部分(期间定期巡检)
在 HEARTBEAT.md:
## 日志检查
- 有没有"遗漏的重要工作"
- 有没有"待处理问题"
时序:
09:00 - 你开始工作
09:30 - Heartbeat #1:检查是否有紧急项
...
20:00 - Cron 触发:"生成日志" → 发飞书
20:05 - Agent 回复:"今天完成 X、问题 Y、明天 Z"
7. 监控与告警:怎么发现问题
看 Cron 执行状态
# 查看最近 10 次执行
openclaw cron runs <job-id> --limit 10
# 输出示例:
# Run 1: 2026-03-10 20:00 ✅ 成功 (耗时 2m 34s)
# Run 2: 2026-03-09 20:00 ✅ 成功 (耗时 2m 18s)
# Run 3: 2026-03-08 20:00 ❌ 失败 (超时)
看 Heartbeat 日志
Heartbeat 的执行日志在 MEMORY.md 或 memory/YYYY-MM-DD.md:
[Tue 2026-03-10 15:30] Heartbeat #5: 检查邮件
- 未读数:3
- 重要标记:来自 CTO 的邮件,主题"紧急需求"
- 已通知用户
[Tue 2026-03-10 15:00] Heartbeat #4: 检查日历
- 今天无会议
- 明天 14:00 有 1v1
设置告警
如果你发现 Cron 连续失败,可以配置:
{
"name": "cron-health-alert",
"schedule": { "kind": "cron", "expr": "0 0 * * *", "tz": "Asia/Shanghai" },
"payload": {
"kind": "agentTurn",
"message": "检查昨天的 Cron 任务是否全部成功,如有失败列出来"
},
"delivery": { "mode": "announce", "channel": "feishu" }
}
8. 最佳实践清单
- Cron 和 Heartbeat 分开配置(不要混)
- Cron 任务设置 timeout(例如 5 分钟超时自动中止)
- Cron 的 timezone 要明确(不要用默认 UTC)
- Heartbeat 频率不要太高(30 分钟起步)
- 定期检查执行日志(看有没有堆积、超时、失败)
- 内存定期清理(防止 MEMORY.md 膨胀)
- Cron 失败要告警(配置一个监控 Cron)
- Test 优先(新的 Cron 先手动触发测试,确认没问题再定时)
结语
Cron 和 Heartbeat 是让 AI 系统"活起来"的两个轮子:
- Cron = 精确、隔离、适合"定时产出"(报告、备份)
- Heartbeat = 灵活、连续、适合"日常巡检"(提醒、维护)
合理搭配这两个,你就能把 OpenClaw 变成一个"24/7 自动运转"的工作系统。不是"我调用它",而是"它在我需要时出现"。
下一篇(05)建议讨论:安全与权限:怎么让多人团队用同一个 OpenClaw 而不互相干扰。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)