乐于分享
好东西不私藏

Session 还是 Cron?OpenClaw 定时任务的正确打开方式

Session 还是 Cron?OpenClaw 定时任务的正确打开方式

OpenClaw 提供了两种机制来处理定时任务:**Heartbeat(主会话轮询)**和 Cron(计划任务)。它们都能让 AI 助手"自动做事",但设计意图和使用场景截然不同。

选错机制的后果很真实:要么消息轰炸、Token 燃烧,要么该提醒的时候没动静。这篇文章帮你理清边界,做出正确选择。


一、问题本质:你在解决什么问题?

先问自己三个问题:

  1. 1. 时间精度要求高吗? "每天早上9点整" vs "每隔一段时间检查一下"
  2. 2. 需要主会话的上下文记忆吗? 助手需要知道你们刚才聊了什么吗?
  3. 3. 这是独立的任务还是批量检查的一部分? 单独运行,还是和其他检查一起跑?

这三个问题的答案,直接决定你该用 Heartbeat 还是 Cron。


二、Heartbeat:周期性感知

Heartbeat 是 OpenClaw 在主会话中定期执行的检查(默认每30分钟一次)。它让助手保持"警觉",查看是否有值得关注的事情。

核心特点

特性
说明
运行位置
主会话(main session)
执行频率
可配置(默认 30 分钟)
上下文
完整的主会话历史
输出方式
有需要才发言,否则回 HEARTBEAT_OK
成本
一次 Agent Turn,可批量处理多个检查

适合场景

  • • 多任务批量检查:一次心跳同时检查邮箱、日历、待办、天气
  • • 上下文感知决策:助手知道你们最近在聊什么,能判断事情的紧急程度
  • • 自然对话延续:能基于之前的对话跟进
  • • 轻量级监控:不需要精确到分钟的定时任务

典型配置

{  agents: {    defaults: {      heartbeat: {        every: "30m",        target: "last",        activeHours: { start: "08:00", end: "22:00" }      }    }  }}

HEARTBEAT.md 示例

在工作目录创建 HEARTBEAT.md,作为助手的检查清单:

# Heartbeat 检查清单- 检查邮箱是否有紧急邮件- 查看日历接下来2小时内是否有事件- 如果有后台任务完成,总结结果- 如果超过8小时没互动,发一个简短的问候

Heartbeat 运行时,助手会读取这个文件并执行其中的检查项。


三、Cron:精确调度

Cron 是 OpenClaw 的内置计划任务系统,可以在精确的时间点执行任务,支持两种运行模式:主会话(system event)或独立会话(isolated)。

核心特点

特性
说明
时间精度
支持标准 Cron 表达式(5字段),可指定时区
执行模式
Main(主会话)或 Isolated(独立会话)
上下文
Main 模式共享主会话,Isolated 模式全新会话
模型选择
Isolated 模式可指定不同模型和思考级别
输出方式
可配置为直接投递到指定渠道

适合场景

  • • 精确时间点:"每周一上午9点发送周报"
  • • 一次性提醒:"20分钟后提醒我开会"
  • • 独立重任务:需要高性能模型(如 Opus)的复杂分析
  • • 不污染主会话:频繁或嘈杂的后台任务
  • • 直接投递:结果直接发到指定频道,不经过主会话

常用命令示例

一次性提醒(主会话)

openclaw cron add \  --name "会议提醒" \  --at "20m" \  --session main \  --system-event "10分钟后开始站会" \  --wake now \  --delete-after-run

每天早上7点推送简报(独立会话)

openclaw cron add \  --name "早间简报" \  --cron "0 7 * * *" \  --tz "Asia/Shanghai" \  --session isolated \  --message "总结今天的天气、日程和待办事项" \  --announce \  --channel whatsapp \  --to "+86138xxxxxxxx"

每周深度分析(使用更强的模型)

openclaw cron add \  --name "周度代码分析" \  --cron "0 6 * * 1" \  --session isolated \  --message "分析本周代码提交,生成质量报告" \  --model opus \  --thinking high \  --announce

四、对比决策表

场景
推荐方案
理由
每30分钟检查邮箱+日历
Heartbeat
批量检查,共享上下文
每天早上9点准时发日报
Cron (isolated)
精确时间,独立运行
20分钟后提醒我
Cron (main, --at)
一次性,精确时间
每周一深度代码审查
Cron (isolated)
重任务,可用更强模型
夜间监控服务器状态
Heartbeat
批量轻量检查
整点推送股市开盘数据
Cron (isolated)
精确到分钟

五、常见误区

误区1:Heartbeat 可以替代 Cron 做精确提醒

错误:把 Heartbeat 间隔调到5分钟,想实现"准点提醒"。

后果

  • • Token 消耗爆炸(每5分钟一次完整 Agent Turn)
  • • 仍然不精确(Heartbeat 会受队列负载影响漂移)
  • • 消息轰炸

正确做法:需要精确时间用 Cron,Heartbeat 保持30分钟以上间隔。

误区2:Cron 任务都走主会话

错误:所有 Cron 任务都用 --session main,导致主会话历史膨胀。

后果

  • • 主会话上下文越来越长,成本上升
  • • 频繁的后台任务干扰正常对话
  • • 历史记录杂乱

正确做法:独立任务走 --session isolated,结果通过 --announce 投递。

误区3:Heartbeat 清单写得过于复杂

错误HEARTBEAT.md 写得像一份完整的工作手册。

后果

  • • 每次心跳 Token 消耗过大
  • • 检查项太多,容易漏掉重点

正确做法:保持清单精简,只放真正需要周期性检查的事项。其他任务拆分到 Cron。


六、最佳实践组合

最高效的设置是两者配合

1. Heartbeat 负责日常感知

# HEARTBEAT.md- 检查邮箱紧急邮件- 查看接下来2小时的日历事件- 检查是否有已完成的背景任务需要汇报- 如果安静超过8小时,发送轻量问候

2. Cron 负责精确任务

# 每天早上7点简报openclaw cron add --name "晨间简报" --cron "0 7 * * *" --session isolated --message "..." --announce# 每周一上午9点周报openclaw cron add --name "周一周报" --cron "0 9 * * 1" --session isolated --message "..." --model opus# 需要时的一次性提醒openclaw cron add --name "临时提醒" --at "2h" --session main --system-event "..." --wake now

七、决策流程图

需要精确到具体时间点?  ├── 是 → 用 Cron  │  └── 否 → 需要主会话上下文?            ├── 是 → 可以用 Cron (main) 或 Heartbeat            │            └── 否 → 能和其他检查一起批量跑?                      ├── 是 → 用 Heartbeat(加入 HEARTBEAT.md)                      └── 否 → 用 Cron (isolated)

八、总结

Heartbeat
Cron
定位
周期性感知
精确调度
精度
分钟级漂移
秒级精确
上下文
主会话完整上下文
Main模式有,Isolated模式无
成本
一次Turn批量检查
每次独立运行
最佳场景
日常监控、批量检查
定时报告、一次性提醒、重任务

一句话原则

  • • 需要精确时间独立运行 → 用 Cron
  • • 需要批量检查上下文感知 → 用 Heartbeat

两者不是互斥的,而是互补的。合理搭配,才能既保证及时性,又控制成本和噪音。


参考文档

  • • OpenClaw Cron vs Heartbeat
  • • Cron Jobs 详细文档
  • • Heartbeat 配置指南