最近在配置 OpenClaw(部署节点)的定期邮件检查时,发现 HEARTBEAT.md 配置了但几乎不执行。排查后发现问题出在对 heartbeat 机制的理解上。
HEARTBEAT.md 是什么 链接到标题
OpenClaw 的 heartbeat 机制是约每 30 分钟触发一次的 agent turn,让 AI 在主会话中检查是否有需要处理的事项。它有两种配置方式:
- 自然语言格式:用 Markdown 标题+列表描述任务
- tasks: 块:YAML 结构化格式
自然语言写法的问题 链接到标题
之前的配置类似这样:
## 定期任务
### 邮件检查(每天 9:00-18:00 每2小时一次)
- 参考 email-cs skill,执行邮件检查流程
这种写法无法被系统级解析。OpenClaw 只是把文件内容作为 prompt 上下文传给 AI,AI 可能偶尔理解并执行,但不是每次都触发。而且 heartbeat-state.json 显示 email: null,说明从未稳定执行过。
tasks: 块的正确格式 链接到标题
2026.4.2 版本后支持结构化的 tasks 块:
tasks:
- name: email-check
interval: 2h
prompt: "参考 email-cs skill,执行邮件检查流程"
OpenClaw 会解析 tasks 块,按 interval 追踪任务到期时间,只有到期任务才会包含在 heartbeat prompt 中。
heartbeat vs cron:何时用哪个 链接到标题
| 场景 | 推荐 | 原因 |
|---|---|---|
| 近似时间(如每隔 2 小时) | heartbeat | 批次检查,节省 API 调用 |
| 精确定时(如每天 9:00) | cron | cron 表达式精确控制 |
heartbeat 的核心逻辑:
- 默认每 30 分钟检查一次
- 任务到期才执行,没到期就跳过
- 时间不精确,每隔 2 小时实际上是每 30 分钟检查,任务到期则执行
结论 链接到标题
heartbeat 适合非严格时间的批次检查(如邮件、日历、通知);需要精确控制执行时间必须用 cron 系统。