10|定时任务与 Heartbeat:让 Agent 自动工作
文章目录
专栏定位:OpenClaw 从入门到精通(第 10 章)
适读人群:开发者、技术爱好者、AI应用创业者
摘要
如果 OpenClaw 只能在对话时工作,那它只是一个响应式的工具。但 OpenClaw 支持两种主动工作模式——定时任务(Cron)和心跳机制(Heartbeat)——让它能够在指定时间自动执行任务,甚至主动给你发消息。本章将深入探讨 Cron 表达式的编写、OpenClaw Cron 任务的配置与管理、HEARTBEAT.md 的检查清单机制,以及如何构建一个完整的自动化工作流。学完本章,你将能够配置「每日早 8 点推送天气 + 检查邮件」这样的自动化场景。
SEO 摘要
OpenClaw Cron 定时任务配置、HEARTBEAT.md 心跳机制、cron 表达式详解、自动任务工作流、定时推送与主动提醒。
目录
- 为什么需要自动化任务
- Cron 表达式详解
- OpenClaw Cron 任务
- Heartbeat 机制
- HEARTBEAT.md 检查清单
- 多任务批处理
- 实战:每日早 8 点天气 + 邮件检查
- 常见错误与避坑指南
- 术语注释
- 面试高频问答
- 深度扩展
- 附录
- 系列总结(第 01-10 章)
- 版权声明
开篇
想象这样一个场景:
每天早上 8:00,在你起床之前,OpenClaw 已经自动完成了这些事情:
- 检查了公司邮箱,把紧急邮件标记出来
- 查询了今天的天气,提醒你是否需要带伞
- 检查了你的日历,看看今天有什么重要会议
- 查看了一下 CI/CD 流水线,看看有没有构建失败
- 把今天的待办事项整理成清单,发到你的飞书
等你 8:30 坐到工位时,所有你需要知道的信息都已经准备好了。
这就是定时任务(Cron)和心跳机制(Heartbeat)的威力——它们让 OpenClaw 从一个「等你问」的被动工具,变成一个「主动告诉你」的智能助手。
核心知识点
1. 为什么需要自动化任务
1.1 被动 vs 主动
大多数 AI 工具都是被动响应的——你问,它答。但 OpenClaw 的设计不止于此:
| 模式 | 工作方式 | 场景 |
|---|---|---|
| 被动响应 | 用户问,AI 答 | 日常对话、问题解答 |
| 定时任务 | 按设定时间自动执行 | 每天日报推送、定期检查 |
| 心跳机制 | 定期检查,主动报告 | 邮件监控、CI 状态 |
1.2 Cron 和 Heartbeat 的区别
| 维度 | Cron | Heartbeat |
|---|---|---|
| 触发方式 | 精确时间 | 周期性(近似) |
| 执行环境 | 独立会话 | 共享主会话上下文 |
| 典型用途 | 定时推送、定期任务 | 状态检查、提醒 |
| API 调用 | 独立 | 共享主会话 |
简单说:Cron 适合定时精确执行的任务,Heartbeat 适合需要上下文判断的主动检查。
2. Cron 表达式详解
2.1 Cron 的基本格式
Cron 表达式有 5 个字段,格式为:
┌───────────── 分钟 (0 - 59)
│ ┌───────────── 小时 (0 - 23)
│ │ ┌───────────── 日期 (1 - 31)
│ │ │ ┌───────────── 月份 (1 - 12)
│ │ │ │ ┌───────────── 星期 (0 - 6,0 = 周日)
│ │ │ │ │
* * * * *
2.2 常用表达式示例
| 表达式 | 含义 |
|---|---|
0 8 * * * | 每天早上 8:00 |
30 8 * * * | 每天早上 8:30 |
0 9 * * 1-5 | 工作日早上 9:00 |
0 */2 * * * | 每 2 小时 |
0 0 * * 0 | 每周日午夜(周一凌晨) |
30 22 * * 1-5 | 工作日晚上 10:30 |
0 0 1 * * | 每月 1 日午夜 |
*/15 * * * * | 每 15 分钟 |
2.3 特殊字符
| 字符 | 含义 | 示例 |
|---|---|---|
* | 任意值 | * * * * * = 每分钟 |
, | 枚举 | 1,15 * * * * = 每小时第 1 和 15 分钟 |
- | 范围 | 0 9-17 * * * = 早上 9 点到下午 5 点每小时 |
/ | 步长 | */5 * * * * = 每 5 分钟 |
? | 不指定(仅用于日/周) | 0 0 ? * 1 = 每周一 |
2.4 中国时区注意事项
OpenClaw 默认使用 UTC 时间。如果你在北京时间(UTC+8),需要相应调整:
| 北京时间 | UTC | Cron 表达式 |
|---|---|---|
| 早上 8:00 | 00:00 | 0 0 * * * |
| 早上 9:00 | 01:00 | 0 1 * * * |
| 晚上 22:00 | 14:00 | 0 14 * * * |
3. OpenClaw Cron 任务
3.1 添加 Cron 任务
# 基础用法
openclaw cron add "0 8 * * *" --name "每日早报" --prompt "
查询今天的天气,生成简报,发送到飞书群
"
# 完整参数
openclaw cron add "0 8 * * *" \
--name "每日早报" \
--prompt "你的任务描述" \
--model "anthropic/claude-3-5-sonnet" \
--timeout 300000
3.2 Cron 任务配置参数
| 参数 | 说明 | 示例 |
|---|---|---|
| schedule | Cron 表达式 | "0 8 * * *" |
| name | 任务名称 | "每日早报" |
| prompt | 执行内容 | 任务描述 |
| model | 使用的模型 | "deepseek-chat" |
| timezone | 时区 | "Asia/Shanghai" |
| timeout | 超时时间(毫秒) | 300000 |
| enabled | 是否启用 | true |
| notification | 完成通知 | true |
3.3 查看 Cron 任务
# 列出所有任务
openclaw cron list
# 输出示例:
# ╔════════════════════════════════════════════════════════════════╗
# ║ Cron Tasks ║
# ╠════════════════════════════════════════════════════════════════╣
# ║ ID NAME SCHEDULE NEXT RUN STATUS ║
# ║ cron_1 每日早报 0 8 * * * 08:00 ✅ 启用 ║
# ║ cron_2 周报生成 0 10 * * 1 Mon 10:00 ✅ 启用 ║
# ║ cron_3 清理日志 0 3 * * * 03:00 ✅ 启用 ║
# ╚════════════════════════════════════════════════════════════════╝
3.4 管理 Cron 任务
# 暂停任务
openclaw cron pause cron_1
# 恢复任务
openclaw cron resume cron_1
# 删除任务
openclaw cron delete cron_3
# 手动触发一次
openclaw cron run cron_1
# 查看任务历史
openclaw cron history cron_1
# 输出:
# cron_1 - 每日早报
# ─────────────────────────────────────────
# 2026-03-29 08:00 ✅ 成功 (耗时 45s)
# 2026-03-28 08:00 ✅ 成功 (耗时 52s)
# 2026-03-27 08:00 ✅ 成功 (耗时 38s)
# 2026-03-26 08:00 ❌ 失败 (API 超时)
# 2026-03-25 08:00 ✅ 成功 (耗时 41s)
3.5 Cron 任务的执行环境
Cron 任务在独立的新会话中执行,这意味着:
- 不加载 MEMORY.md(没有用户上下文)
- 不加载 USER.md(没有用户偏好)
- 有独立的上下文窗口
如果需要用户信息,需要在 prompt 中提供:
openclaw cron add "0 8 * * *" \
--name "每日早报" \
--prompt "
这是为用户 李明 执行的早间简报任务。
用户偏好:
- 喜欢简洁的格式
- 不喜欢太长的内容(控制在 500 字以内)
- 关注天气和日程
执行内容:
1. 查询北京今天天气
2. 查询用户日历(如果有 Google Calendar API)
3. 整理成简报,发送到飞书群
发送格式:
【早间简报】🌅
📅 日期:xxx
🌤️ 天气:xxx
📋 日程:xxx
..."
4. Heartbeat 机制
4.1 什么是 Heartbeat
Heartbeat(心跳)是一种轻量级的定期检查机制。当 OpenClaw 收到心跳消息时,它会读取 HEARTBEAT.md 文件,按照其中的检查清单执行任务。
与 Cron 的区别:
| 维度 | Cron | Heartbeat |
|---|---|---|
| 触发频率 | 精确(定时) | 近似(每 N 分钟) |
| 执行会话 | 新建独立会话 | 主会话(有上下文) |
| 主要用途 | 定时推送、定期任务 | 状态检查、主动提醒 |
| 配置位置 | openclaw cron | HEARTBEAT.md |
4.2 Heartbeat 的触发
Heartbeat 通常由外部系统定期触发:
# 通过 Webhook 触发心跳
curl -X POST http://localhost:18792/heartbeat \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
或者由其他定时器触发:
# 每 30 分钟触发一次心跳
*/30 * * * * curl -s http://localhost:18792/heartbeat
4.3 Heartbeat vs Cron 选择
需要精确时间吗?
↓ 是
→ Cron
需要用户的完整上下文吗?
↓ 是
→ Heartbeat
需要发送消息到用户吗?
↓ 是
→ Heartbeat
任务是否危险/不可逆?
↓ 是
→ Cron(独立会话更安全)
是否需要不同模型?
↓ 是
→ Cron
5. HEARTBEAT.md 检查清单
5.1 基本结构
# HEARTBEAT.md
## Periodic Checks
Rotate through these checks on each heartbeat:
- [ ] Check unread emails
- [ ] Check calendar for upcoming events
- [ ] Check CI/CD pipeline status
## Always Check
- Any pending tasks from previous conversations?
- Any overdue follow-ups?
## Proactive Announcements
When I find something important, send a notification.
When nothing needs attention, reply HEARTBEAT_OK.
## Quiet Hours
No proactive announcements during 23:00 - 08:00.
Weekend: no announcements before 10:00.
## State Tracking
Use `memory/heartbeat-state.json` to track last check times.
5.2 检查项分类
第一类:信息获取(只读)
### Information Gathering
- [ ] Check Gmail unread count
- [ ] Check Google Calendar (events in next 2 hours)
- [ ] Check weather (if user might go outside)
- [ ] Check Slack/Feishu unread messages
第二类:状态检查
### Status Checks
- [ ] CI/CD pipeline: any failures?
- [ ] Cron tasks: any missed runs?
- [ ] Disk space: any servers running low?
第三类:主动提醒
### Reminders
- [ ] Meeting in 15 minutes?
- [ ] Deadline approaching (within 24h)?
- [ ] Long-pending tasks that need follow-up?
5.3 状态追踪
为了避免重复检查,使用 heartbeat-state.json 追踪上次检查时间:
{
"lastChecks": {
"email": 1703275200,
"calendar": 1703260800,
"weather": null,
"ci": 1703250000
},
"checkIntervals": {
"email": 1800,
"calendar": 900,
"weather": 10800,
"ci": 300
}
}
检查逻辑:
def should_check_email():
last = state["lastChecks"]["email"]
interval = state["checkIntervals"]["email"]
return (now - last) >= interval
5.4 静默时段
HEARTBEAT.md 支持配置静默时段:
## Quiet Hours
### Weekdays (Mon-Fri)
No proactive announcements: 23:00 - 08:00
### Weekends
No proactive announcements: 23:00 - 10:00
### Exceptions
Even during quiet hours, still check and report:
- System failures (CI/CD down)
- Security alerts
- Critical deadlines
6. 多任务批处理
6.1 批处理策略
当有多个检查任务时,使用批处理减少 API 调用:
## Batch Strategy
Instead of separate checks, batch similar tasks:
**Batch 1: Communication**
- Email (unread count, urgent items)
- Slack/Feishu mentions
- Calendar events
**Batch 2: Infrastructure**
- CI/CD status
- Server health
- Error logs
**Batch 3: Project Status**
- Jira task updates
- GitHub PR activity
- Deadline tracking
Rotate batches across heartbeats:
- Heartbeat 1: Communication
- Heartbeat 2: Infrastructure
- Heartbeat 3: Project Status
- Heartbeat 4: (quick sweep of all)
6.2 优先级处理
## Priority Levels
### P0 - Always Report (any time)
- Critical system failures
- Security incidents
- Production bugs
### P1 - During Work Hours
- CI/CD failures
- Meeting reminders
- Deadline reminders
### P2 - Daily Summary Only
- Non-urgent emails
- Team activity summaries
- Weekly reports
6.3 任务超时
每个检查任务应该设置合理的超时:
## Timeouts Per Check
- Email check: 10 seconds
- Calendar check: 10 seconds
- CI/CD check: 15 seconds
- Weather: 5 seconds
Total heartbeat budget: 60 seconds
If running over, stop and log.
7. 实战:每日早 8 点天气 + 邮件检查
7.1 需求
每天早上 8:00:
- 检查 Gmail 邮箱,获取未读数量和紧急邮件
- 查询北京天气和上海天气
- 生成简报发送到飞书群
7.2 配置步骤
第一步:安装必要 Skills
# 确认 weather skill 已安装
openclaw skills list | grep weather
# 确认 feishu message 已配置
cat .env | grep FEISHU
第二步:配置邮件检查
如果使用 Gmail,需要配置 Gmail API 或使用 IFTTT/Zapier 等中间件。为了简化,我们使用 IFTTT Webhook 作为示例。
第三步:创建 Cron 任务
openclaw cron add "0 8 * * *" \
--name "每日早间简报" \
--timezone "Asia/Shanghai" \
--timeout 300000 \
--prompt "
你是李明的早间助理。请执行以下任务:
## 任务背景
用户:李明
发送目的地:飞书群 oc_xxxxxxxxxxxxxxxxxxxxxxxxxxxx
现在时间:2026年3月30日早上8点
## 任务清单
### 1. 检查邮件状态
检查 Gmail 邮箱,获取:
- 未读邮件总数
- 标记为「重要」的未读邮件(最多3封)
- 发件人和主题
如果没有紧急邮件,报告「暂无紧急邮件 ✅」
### 2. 查询天气
查询以下城市的今日天气:
- 北京:温度、天气状况、是否适合出行
- 上海:温度、天气状况、是否需要带伞
使用 weather skill 查询。
### 3. 生成简报
格式如下:
【早间简报】🌅 2026-03-30
📧 邮件状态
• 未读:X 封
• 重要:
- [发件人] [主题]
- ...
🌤️ 今日天气
• 北京:XX°C,晴,适合出行
• 上海:XX°C,有雨,记得带伞🌂
📋 今日提示
• ...
---
🤖 由 OpenClaw AI 助手自动生成
"
### 4. 发送简报
使用 message tool 发送到飞书群:
- channel: feishu
- target: oc_xxxxxxxxxxxxxxxxxxxxxxxxxxxx
- message: 上面生成的简报内容
"
第四步:验证
# 查看任务
openclaw cron list
# 手动触发测试
openclaw cron run cron_1
# 查看日志
openclaw logs --tail 50
7.3 高级版:加入 Heartbeat 检查
除了早上的定时简报,还可以在 HEARTBEAT.md 中配置日常检查:
# HEARTBEAT.md
## Periodic Checks (Rotate)
### Check 1 (Every 30 min during work hours)
- Check email unread count
- If > 10 unread OR any marked important → Report
### Check 2 (Every 2 hours during work hours)
- Check CI/CD pipeline status
- If any failures → Report immediately
### Check 3 (Every morning at 9:30)
- Check calendar for today's meetings
- If meetings in next 30 min → Reminder
## Always Check
- Any urgent tasks from previous conversations?
## Proactive Announcements
Send message when:
- Critical email received
- CI/CD pipeline failed
- Meeting starting in 15 minutes
- User asked me to remind them
Stay silent (HEARTBEAT_OK) when:
- Nothing noteworthy found
- During quiet hours (23:00 - 08:00)
- Weekend mornings before 10:00
## Quiet Hours
Weekdays: 23:00 - 08:00
Weekends: 23:00 - 10:00
## State Tracking
Last checks stored in memory/heartbeat-state.json
Check intervals defined in that file.
常见错误与避坑指南
错误 1:Cron 表达式时区错误
症状: 任务总是在预期时间的前/后 8 小时执行
原因: 忘记 OpenClaw 默认使用 UTC,需要换算
解决:
# 使用 --timezone 参数明确指定
openclaw cron add "0 8 * * *" --timezone "Asia/Shanghai"
# 或者换算成 UTC
# 北京时间 8:00 = UTC 0:00
openclaw cron add "0 0 * * *"
错误 2:Cron 任务没有发送消息
症状: 任务执行了(看日志)但群里没有收到消息
排查:
- 确认飞书 channel 配置正确
- 确认 chat_id 正确
- 检查 message prompt 是否包含了发送指令
- 查看 OpenClaw 日志中的发送结果
错误 3:Heartbeat 过于频繁
症状: OpenClaw 响应变慢,API 消耗激增
原因: Heartbeat 配置了太多检查项,或者触发频率太高
解决:
# 优化:减少检查频率和项数
## 每次心跳只检查一项
- Heartbeat 1: Email
- Heartbeat 2: Calendar
- Heartbeat 3: CI/CD
- 轮换进行,不要每次全部检查
错误 4:Cron 任务超时
症状: 任务执行中断,日志显示超时
原因: 任务执行时间超过了 timeout 设置
解决:
# 增加 timeout 时间
openclaw cron add "0 8 * * *" \
--name "复杂任务" \
--timeout 600000 # 10 分钟
# 或者优化任务,减少工作量
错误 5:静默时段没有生效
症状: 深夜仍然收到推送
原因: HEARTBEAT.md 的静默时段规则没有正确配置
解决: 确保在 HEARTBEAT.md 中明确写入了静默规则:
## Quiet Hours
**Weekdays (Mon-Fri):** 23:00 - 08:00
**Weekends:** 23:00 - 10:00
**During quiet hours:** Only send for P0 (critical) events.
术语注释
| 术语 | 英文 | 解释 |
|---|---|---|
| Cron | 时间调度 | Unix 系统中的定时任务工具 |
| Heartbeat | 心跳 | 定期触发的检查机制 |
| HEARTBEAT.md | 心跳配置文件 | 定义心跳检查项的清单 |
| Quiet Hours | 静默时段 | 不主动推送的时间段 |
| Batch Processing | 批处理 | 合并多个任务一次执行 |
| Timeout | 超时 | 任务最大执行时间 |
面试高频问答
Q1:Cron 和 Heartbeat 各有什么适用场景?
回答:Cron 适合精确时间驱动的任务和需要隔离执行的任务。比如每天早上 8:00 推送日报(精确)、定时备份数据库(危险操作,需要隔离)、发送周报邮件(定时)。Heartbeat 适合需要上下文判断的主动检查和高频但轻量的监控。比如检查是否有紧急邮件(有上下文判断:什么是紧急)、CI/CD 失败了需要立即通知(主动推送)、用户是否忘记了某个待办(上下文相关)。
Q2:如何避免 Heartbeat 产生大量无效通知?
回答:三个策略。第一是静默时段:深夜不推送,非工作时间降低频率。第二是阈值控制:比如「未读邮件 > 10 封才推送」而不是每封都推。第三是去重:同一个问题已经提醒过了,短时间内不再提醒。通过 heartbeat-state.json 追踪上次提醒的内容和时间。
Q3:Cron 任务的执行失败率很高怎么办?
回答:首先检查失败原因——是 API 超时?外部服务挂了?还是代码错误?常见处理:增加 timeout 时间(如果超时);实现重试机制(如果外部服务不稳定);将大型任务拆分成小步骤。也可以设置补偿任务——Cron 任务失败后,下一次心跳时检测并尝试补救。
深度扩展
深度 1:Cron 任务的执行日志与告警
配置 Cron 任务失败时的告警:
openclaw cron add "0 8 * * *" \
--name "每日日报" \
--prompt "..." \
--on-failure "notify" \
--notify-channel "feishu" \
--notify-target "oc_xxx"
这会在 Cron 任务失败时自动发送告警到飞书群。
深度 2:条件执行
更高级的 Cron 支持条件触发:
# 只有在满足条件时才执行
openclaw cron add "0 8 * * *" \
--name "工作日日报" \
--condition "day_of_week >= 1 AND day_of_week <= 5" \
--prompt "发送日报..."
深度 3:Cron 链式任务
一个任务完成后触发下一个任务:
# 任务 A:数据采集
openclaw cron add "0 7 * * *" \
--name "采集数据" \
--prompt "从 Jira 采集昨日数据,保存到..." \
--on-complete "trigger:cron_2"
# 任务 B:生成报告(由任务 A 触发)
openclaw cron add "0 8 * * *" \
--name "生成报告" \
--prompt "读取昨日数据,生成报告..." \
--trigger-mode "manual_or_on_complete:cron_1"
附录
A.1 Cron 表达式速查表
| 时间 | Cron | 说明 |
|---|---|---|
| 每分钟 | * * * * * | 调试用 |
| 每小时 | 0 * * * * | 每小时整点 |
| 每天 8:00 | 0 8 * * * | UTC 0:00 = 北京 8:00 |
| 每天 9:00 | 0 9 * * * | UTC 1:00 = 北京 9:00 |
| 工作日 8:00 | 0 8 * * 1-5 | 周一至周五 |
| 每周一 10:00 | 0 10 * * 1 | UTC 2:00 = 北京 10:00 |
| 每月 1 日 | 0 0 1 * * | UTC 0:00 = 北京 8:00 |
| 每 15 分钟 | */15 * * * * | 频率较高 |
A.2 Cron 管理命令
openclaw cron list # 列出所有任务
openclaw cron add # 添加任务
openclaw cron delete <id> # 删除任务
openclaw cron pause <id> # 暂停任务
openclaw cron resume <id> # 恢复任务
openclaw cron run <id> # 手动触发一次
openclaw cron history <id> # 查看执行历史
openclaw cron edit <id> # 编辑任务
A.3 HEARTBEAT.md 模板
# HEARTBEAT.md
## Periodic Checks (Rotate)
- [ ] [检查项 1]
- [ ] [检查项 2]
- [ ] [检查项 3]
## Always Check
- 有没有需要跟进的?
## Proactive Announcements
通知用户当:
- [条件 1]
- [条件 2]
静默(HEARTBEAT_OK)当:
- [静默条件]
## Quiet Hours
- 工作日:23:00 - 08:00
- 周末:23:00 - 10:00
## State Tracking
memory/heartbeat-state.json
系列总结(第 01-10 章)
通过前十章的学习,我们已经全面掌握了 OpenClaw 的核心能力:
第 01-06 章: 基础认知、配置体系、人格设计、记忆系统、Skills 架构、核心工具集
第 07-08 章: 编程 Agent 集成、多模型智能路由
第 09 章: 飞书集成,打造企业级 AI 助手
第 10 章: 定时任务与 Heartbeat,让 Agent 自动工作
现在你已经能够构建完整的自动化工作流。接下来的两章我们将学习复杂任务分解与执行(Subagent 与会话管理)以及安全与权限控制。读完第 11 和 12 章,你将能够安全地在生产环境中部署 OpenClaw。
版权声明
本文为原创技术实践文章,禁止未经授权的全文转载;引用请注明出处与本文链接。
更多推荐



所有评论(0)