Skip to content

Cron vs Heartbeat:如何选择

心跳(heartbeat)和 cron 任务都能让你按计划运行任务。本指南帮你为具体场景选择合适的机制。

快速决策表

使用场景推荐方式理由
每 30 分钟检查一次收件箱Heartbeat与其他检查批量执行,具备上下文感知
每天早上 9 点准时发送日报Cron(隔离)需要精确时间
监控日历中的即将事件Heartbeat天然适合周期性感知
每周运行深度分析Cron(隔离)独立任务,可使用不同模型
20 分钟后提醒我Cron(主会话,--at一次性精确定时
后台项目健康检查Heartbeat搭便车现有周期

Heartbeat:周期性感知

心跳在主会话中按固定间隔运行(默认 30 分钟),让 agent 定期检查事项并浮现重要信息。

适合 heartbeat 的场景

  • 多项周期性检查:与其用 5 个 cron 任务分别检查收件箱、日历、天气、通知和项目状态,一次心跳就能批量处理所有这些。
  • 上下文感知决策:agent 拥有完整主会话上下文,能智能判断什么紧急、什么可以等。
  • 对话连续性:心跳运行共享同一会话,agent 记得最近的对话,可以自然地跟进。
  • 低开销监控:一次心跳替代多个小型轮询任务。

Heartbeat 的优势

  • 批量检查:一次 agent 轮次可同时审查收件箱、日历和通知。
  • 减少 API 调用:一次心跳比 5 个独立 cron 任务更省钱。
  • 上下文感知:agent 了解你在做什么,能合理排优先级。
  • 智能抑制:无需关注的情况下,agent 回复 HEARTBEAT_OK,不发送任何消息。
  • 自然时机:根据队列负载略有漂移,对大多数监控场景都没问题。

Heartbeat 示例:HEARTBEAT.md 清单

md
# Heartbeat checklist

- Check email for urgent messages
- Review calendar for events in next 2 hours
- If a background task finished, summarize results
- If idle for 8+ hours, send a brief check-in

agent 每次心跳读取这份清单,一次性处理所有事项——这就是龙虾的高效之处。

配置 heartbeat

json5
{
  agents: {
    defaults: {
      heartbeat: {
        every: "30m", // 间隔
        target: "last", // 显式告警投递目标(默认 "none")
        activeHours: { start: "08:00", end: "22:00" }, // 可选
      },
    },
  },
}

完整配置参见 Heartbeat(如有该页面)。

Cron:精确调度

Cron 任务在精确时间运行,可在隔离会话中运行而不影响主上下文。周期性整点调度会自动按每任务确定性偏移在 0-5 分钟窗口内错开。

适合 cron 的场景

  • 需要精确时间:"每周一早上 9:00 发送"(不是"9 点左右")。
  • 独立任务:不需要对话上下文的任务。
  • 不同模型/思考级别:需要更强大模型的重度分析。
  • 一次性提醒:用 --at 实现"20 分钟后提醒我"。
  • 嘈杂/高频任务:会堆积主会话历史的任务。
  • 外部触发:无论 agent 是否活跃都应独立运行的任务。

Cron 的优势

  • 精确时间:支持 5 字段或 6 字段(含秒)cron 表达式,带时区支持。
  • 内置负载分散:周期性整点调度默认最多错开 5 分钟。
  • 每任务控制:用 --stagger <duration> 覆盖错开,或用 --exact 强制精确。
  • 会话隔离:在 cron:<jobId> 中运行,不污染主历史。
  • 模型覆盖:按任务使用更便宜或更强大的模型。
  • 交付控制:隔离任务默认 announce(摘要);按需选择 none
  • 即时投递:Announce 模式直接发布,无需等待心跳。
  • 不依赖 agent 上下文:即使主会话空闲或已压缩也能运行。
  • 一次性支持--at 支持精确的未来时间戳。

Cron 示例:每日早报

bash
openclaw cron add \
  --name "Morning briefing" \
  --cron "0 7 * * *" \
  --tz "America/New_York" \
  --session isolated \
  --message "Generate today's briefing: weather, calendar, top emails, news summary." \
  --model opus \
  --announce \
  --channel whatsapp \
  --to "+15551234567"

这会在纽约时间早上 7:00 精确运行,使用 Opus 保证质量,并直接 announce 摘要到 WhatsApp。

Cron 示例:一次性提醒

bash
openclaw cron add \
  --name "Meeting reminder" \
  --at "20m" \
  --session main \
  --system-event "Reminder: standup meeting starts in 10 minutes." \
  --wake now \
  --delete-after-run

完整 CLI 参考见 Cron 任务

决策流程图

任务需要在精确时间运行吗?
  是 -> 用 cron
  否 -> 继续...

任务需要与主会话隔离吗?
  是 -> 用 cron(隔离)
  否 -> 继续...

这个任务能与其他周期性检查批量处理吗?
  是 -> 用 heartbeat(加入 HEARTBEAT.md)
  否 -> 用 cron

这是一次性提醒吗?
  是 -> 用 cron + --at
  否 -> 继续...

需要不同的模型或思考级别吗?
  是 -> 用 cron(隔离)+ --model/--thinking
  否 -> 用 heartbeat

两者结合使用

最高效的配置是两者配合

  1. Heartbeat 每 30 分钟批量处理一次常规监控(收件箱、日历、通知)。
  2. Cron 处理精确调度(日报、周报)和一次性提醒。

示例:高效自动化配置

HEARTBEAT.md(每 30 分钟检查):

md
# Heartbeat checklist

- Scan inbox for urgent emails
- Check calendar for events in next 2h
- Review any pending tasks
- Light check-in if quiet for 8+ hours

Cron 任务(精确时间):

bash
# 每天早上 7 点早报
openclaw cron add --name "Morning brief" --cron "0 7 * * *" --session isolated --message "..." --announce

# 每周一早上 9 点项目回顾
openclaw cron add --name "Weekly review" --cron "0 9 * * 1" --session isolated --message "..." --model opus

# 一次性提醒
openclaw cron add --name "Call back" --at "2h" --session main --system-event "Call back the client" --wake now

Lobster:带审批的确定性工作流

Lobster 是用于多步骤工具流水线的工作流运行时,适合需要确定性执行和显式审批的场景。当任务不止一次 agent 轮次,且你想要可恢复的带人工检查点的工作流时,用 Lobster。

Lobster 的适用场景

  • 多步骤自动化:需要固定的工具调用流水线,而不是一次性提示词。
  • 审批关卡:副作用应暂停直到你审批,再继续。
  • 可恢复运行:在不重跑早期步骤的情况下继续暂停的工作流。

与 heartbeat 和 cron 的配合

  • Heartbeat/cron 决定_何时_运行。
  • Lobster 定义运行后_执行哪些步骤_。

定时工作流:用 cron 或 heartbeat 触发调用 Lobster 的 agent 轮次。临时工作流:直接调用 Lobster。

操作说明

  • Lobster 以本地子进程lobster CLI)工具模式运行,返回 JSON 信封
  • 若工具返回 needs_approval,用 resumeTokenapprove 标志恢复。
  • 该工具为可选插件;通过 tools.alsoAllow: ["lobster"](推荐)按需启用。
  • Lobster 需要 lobster CLI 在 PATH 上。

完整用法和示例见 Lobster(如有该页面)。

主会话 vs 隔离会话

HeartbeatCron(主)Cron(隔离)
会话主(通过系统事件)cron:<jobId> 或自定义会话
历史共享共享每次新建(隔离)/ 持久化(自定义)
上下文完整完整无(隔离)/ 累积(自定义)
模型主会话模型主会话模型可覆盖
输出HEARTBEAT_OK 时投递心跳提示词 + 事件Announce 摘要(默认)

何时使用主会话 cron

--session main + --system-event 当你希望:

  • 提醒/事件出现在主会话上下文中
  • agent 在下次心跳时以完整上下文处理
  • 不需要单独的隔离运行
bash
openclaw cron add \
  --name "Check project" \
  --every "4h" \
  --session main \
  --system-event "Time for a project health check" \
  --wake now

何时使用隔离 cron

--session isolated 当你希望:

  • 全新开始,无历史上下文
  • 不同的模型或思考设置
  • 直接 announce 摘要到渠道
  • 历史不污染主会话
bash
openclaw cron add \
  --name "Deep analysis" \
  --cron "0 6 * * 0" \
  --session isolated \
  --message "Weekly codebase analysis..." \
  --model opus \
  --thinking high \
  --announce

成本考量

机制成本特征
Heartbeat每 N 分钟一次轮次;随 HEARTBEAT.md 大小线性扩展
Cron(主)向下次心跳添加事件(无独立轮次)
Cron(隔离)每任务一次完整 agent 轮次;可使用更便宜的模型

小贴士

  • 保持 HEARTBEAT.md 简洁以减少 token 开销。
  • 把类似检查合并到 heartbeat,而不是多个 cron 任务。
  • 仅需内部处理时,heartbeat 用 target: "none"
  • 常规任务用隔离 cron + 更便宜的模型。

相关文档

  • Heartbeat(如有)— heartbeat 完整配置
  • Cron 任务 — cron CLI 和 API 完整参考
  • System(如有)— 系统事件 + heartbeat 控制