跟我一起学 OpenClaw(04):Cron、Heartbeat 与自动化——让 AI 在你不说话时持续产出

前言

前三篇我们完成了这些:

  • 第 1 篇:理解 OpenClaw 的核心(Gateway / Sessions / Tools & Skills)
  • 第 2 篇:跑通 Agent 配置与工作流(以飞书接入为例)
  • 第 3 篇:进入工程化(插件与技能体系、allowlist 稳定策略)

这篇我们讨论一个对长期运营 AI 系统至关重要的话题:自动化与调度

因为你会遇到这样的场景:

我不想每次都手动启动任务。我想让 Agent 在后台"该干活时干活",无需我操控。

这就涉及两个系统:

  1. Cron - 精确时间触发(“每天 9:00 AM”、“每周一早上”)
  2. 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 会:

  1. HEARTBEAT.md
  2. 轮转选择 2-3 项执行
  3. 如果发现"重要"则通知你
  4. 更新内存

不需要 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 爆炸

解决

  1. 先检查任务时长(加 timeout)
  2. 调整触发间隔(改成 15 分钟触发一次)
  3. 监控执行队列cron runs 看堆积情况)

坑 2:Heartbeat 频繁刷新内存导致成本上升

问题

- Heartbeat 每次都要读 MEMORY.md
- MEMORY.md 太大(100KB+)
- 多次 heartbeat = token 浪费

解决

  1. 定期清理 MEMORY.md(删除过期条目)
  2. 分离到向量库(用 memory-lancedb 插件做向量搜索)
  3. 降低 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.mdmemory/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 而不互相干扰

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐