乐于分享
好东西不私藏

OpenClaw 自动化任务:心跳机制与定时任务实战

OpenClaw 自动化任务:心跳机制与定时任务实战

一、前言:为什么你的 AI 助手总是"被动"?

你有没有这样的经历:

  • 早上打开电脑,才发现昨晚有重要邮件没处理

  • 开会前 5 分钟,突然想起有个日程忘了准备

  • 模型 API 额度用完了,跑了一半的任务报错

  • Git 仓库好久没同步,代码冲突一堆

问题不在你,而在你的 AI 助手太"被动"。

它只会等你下指令,不会主动检查、主动提醒、主动执行。就像个只会听命令的机器人,而不是真正懂你的数字助手。

今天这篇文章,我要帮你把 OpenClaw 从"被动响应"升级成"主动服务"。

学完你能做到

  • ✅ 让 AI 每天自动检查邮件和日历

  • ✅ 设置定时任务监控模型额度

  • ✅ 自动同步 Git 仓库状态

  • ✅ 创建周期性提醒(喝水/休息/日报)

  • ✅ 理解心跳与 Cron 的区别,合理选择

这是 OpenClaw 系列第 4 篇,建议先阅读前 3 篇:

  • 001 | OpenClaw 深度测评

  • 002 | OpenClaw 安装配置完全指南

  • 003 | OpenClaw 记忆系统详解

二、心跳机制:让 AI 学会"主动关心"

2.1 什么是心跳?

想象一下,你有个贴心的助理,每隔几小时就来问一次:

"老板,有什么需要我检查的吗?邮箱?日历?天气?"

这就是心跳机制——AI 定期"醒过来",主动检查你关心的事情。

在 OpenClaw 中,心跳通过 HEARTBEAT.md 文件配置。当系统发送心跳 poll 时,AI 会读取这个文件,执行指定的检查任务。

2.2 心跳 vs Cron:什么时候用哪个?

这是很多人容易混淆的点。先说结论:

场景推荐方案原因
多个检查可以批量执行心跳一次唤醒,多项检查,省 token
需要精确时间(如 9:00 整)Cron心跳时间会漂移
需要结合最近聊天上下文心跳心跳在主会话,有上下文
任务需要隔离执行CronCron 可创建独立子会话
简单提醒(如"喝水")Cron轻量,不占主会话
复杂检查(邮件 + 日历 + 天气)心跳可组合多项检查

经验法则

  • 心跳 = "定期检查多项事务"

  • Cron = "精确时间执行单一任务"

2.3 HEARTBEAT.md 配置详解

先看看默认的心跳文件内容:

# HEARTBEAT.md# Keep this file empty (or with only comments) to skip heartbeat API calls.# Add tasks below when you want the agent to check something periodically.

默认是空的,这意味着心跳 poll 时 AI 会回复 HEARTBEAT_OK,不做任何事。

要启用心跳,你需要在文件中添加检查任务。例如:

# 心跳检查清单## 待办事项[ ] 检查未读邮件(过去 4 小时)[ ] 检查日历(未来 24 小时)[ ] 检查天气(明天是否下雨)[ ] 检查 Git 仓库状态## 注意事项晚上 23:00-08:00 保持安静,除非紧急如果人类正在忙碌,减少打扰有重要事项才主动通知,否则回复 HEARTBEAT_OK

关键点

  1. 心跳检查是对话式的,AI 会理解你的意图

  2. 不需要写代码,用自然语言描述即可

  3. AI 会记住上次检查时间,避免重复

  4. 可以在 memory/heartbeat-state.json 追踪状态

2.4 心跳实战:配置你的第一个检查

让我们配置一个实用的心跳检查清单:

# HEARTBEAT.md - 尘风的日常检查## 每日检查(每 4-6 小时)### 工作相关[ ] 邮箱:检查过去 4 小时的未读邮件,标记紧急的[ ] 日历:检查未来 24 小时的会议,提前 2 小时提醒[ ] Git:检查工作区仓库状态,有变更才通知### 生活相关[ ] 天气:如果明天降雨概率>50%,提醒带伞[ ] 空气:如果 AQI>100,提醒戴口罩### 项目监控[ ] 公众号:检查新文章数据(阅读/收藏/转发)[ ] 模型额度:检查各厂商剩余额度,低于 20% 预警## 静默规则23:00-08:00:除非紧急邮件,否则不通知如果人类连续 2 小时无操作,降低检查频率每次心跳先检查距离上次通知的时间,避免打扰## 通知策略重要事项:直接发消息通知一般事项:累积到下次心跳一起汇报无事项:回复 HEARTBEAT_OK(不显示给用户)

配置好后,AI 会在每次心跳时自动执行这些检查,有重要事项才通知你。

三、Cron 定时任务:精确控制执行时间

3.1 Cron 基础概念

Cron 是 Linux 传统的定时任务系统,OpenClaw 通过 cron 工具提供了类似功能。

Cron 表达式格式

┌───── 分钟 (0-59)│ ┌───── 小时 (0-23)│ │ ┌───── 日期 (1-31)│ │ │ ┌───── 月份 (1-12)│ │ │ │ ┌───── 星期 (0-6, 0=周日)│ │ │ │ │* * * * *

常用示例

表达式含义
0 9 * * *每天早上 9:00
0 0 * * 1每周一凌晨 0:00
*/30 * * * *每 30 分钟
0 8-20/2 * * *每天 8:00-20:00,每 2 小时
0 0 1 * *每月 1 号凌晨 0:00

3.2 OpenClaw Cron 任务类型

OpenClaw 的 Cron 支持两种任务类型:

类型 1:System Event(系统事件)

向主会话注入消息,适合提醒类任务:

{"name""早晨提醒","schedule": {"kind""cron","expr""0 8 * * *","tz""Asia/Shanghai"  },"payload": {"kind""systemEvent","text""☀️ 早上好!今天是周二,记得参加 10:00 的团队会议。"  },"sessionTarget""main","enabled"true}

注意sessionTarget: "main" 必须搭配 payload.kind: "systemEvent"

类型 2:Agent Turn(代理执行)

创建独立会话执行任务,适合复杂任务:

{"name""模型额度检查","schedule": {"kind""cron","expr""0 20 * * *","tz""Asia/Shanghai"  },"payload": {"kind""agentTurn","message""运行 scripts/check-quotas.ps1,更新 memory/model-quota-state.json,如果有额度低于 20% 的厂商,通知用户。","timeoutSeconds"300  },"sessionTarget""isolated","delivery": {"mode""announce"  },"enabled"true}

注意sessionTarget: "isolated" 必须搭配 payload.kind: "agentTurn"

3.3 创建 Cron 任务

使用 cron 工具的 add 动作创建任务:

# 通过 OpenClaw 内部调用(伪代码)cron action=add job={"name""每日邮件检查","schedule": {"kind""cron""expr""0 9 * * *""tz""Asia/Shanghai"},"payload": {"kind""systemEvent""text""📬 提醒:检查昨日邮件"},"sessionTarget""main","enabled"true}

在 OpenClaw 中,你可以通过自然语言让 AI 帮你创建:

"帮我创建一个每天早上 9 点的提醒,内容是'检查邮箱和日历'"

AI 会自动调用 cron add 创建任务。

3.4 管理 Cron 任务

操作命令说明
查看任务cron list列出所有任务
查看禁用任务cron list includeDisabled=true包含已禁用的
立即执行cron run jobId=<id>手动触发一次
更新任务cron update jobId=<id> patch={...}修改配置
删除任务cron remove jobId=<id>永久删除
查看执行历史cron runs jobId=<id>查看过往执行记录

四、实战案例 1:每日邮件检查

4.1 需求分析

目标:每天早上 9:00 自动检查邮箱,汇总未读邮件。

检查内容

  • 过去 24 小时的未读邮件数量

  • 标记为"紧急"的邮件(如老板/客户发来的)

  • 包含关键词的邮件(如"紧急"/"会议"/"截止")

通知策略

  • 有紧急邮件:立即通知,列出标题和发件人

  • 无紧急邮件:不通知(静默检查)

4.2 实现方案

由于 OpenClaw 本身不直接连接邮箱,我们需要借助外部工具:

方案 A:使用 IFTTT/Zapier webhook

  1. 在 IFTTT 创建规则:新邮件 → 发送 webhook

  2. 在 OpenClaw 创建 webhook 接收任务

  3. 收到 webhook 后,AI 汇总并通知

方案 B:使用本地脚本 + Cron

  1. 编写 PowerShell 脚本检查邮箱(通过 IMAP)

  2. 脚本输出未读邮件列表到文件

  3. Cron 定时读取文件并通知

方案 C:使用 MCP Server(推荐)

  1. 配置 Gmail MCP Server

  2. 通过 mcporter skill 调用

  3. AI 直接查询邮箱

这里展示方案 C的实现:

4.3 配置步骤

步骤 1:安装 Gmail MCP Server

npx -y @modelcontextprotocol/server-gmail

步骤 2:配置 mcporter

在 TOOLS.md 添加:

### MCP Servers- Gmail: stdio 模式,命令 `npx -y @modelcontextprotocol/server-gmail`- 认证:OAuth 2.0,首次运行会打开浏览器授权

步骤 3:创建 Cron 任务

让 AI 帮你创建:

"创建一个每天早上 9 点的 Cron 任务,使用 Gmail MCP 检查未读邮件,如果有紧急邮件就通知我"

AI 会生成类似配置:

{  "name": "每日邮件检查",  "schedule": {    "kind": "cron",    "expr": "0 9 * * *",    "tz": "Asia/Shanghai"  },  "payload": {    "kind": "agentTurn",    "message": "使用 mcporter 连接 Gmail MCP,查询过去 24 小时的未读邮件。筛选发件人包含'老板'或主题包含'紧急'的邮件。如果有,通知用户;如果没有,静默结束。",    "timeoutSeconds": 300  },  "sessionTarget": "isolated",  "delivery": {    "mode": "announce"  },  "enabled": true}

4.4 测试与验证

创建后,立即手动执行一次:

cron run jobId=<任务 ID>

检查输出是否符合预期,然后调整为正式配置。

五、实战案例 2:日历提醒

5.1 需求分析

目标:会议前 2 小时自动提醒,避免忘记准备。

检查内容

  • 未来 24 小时内的所有会议

  • 会议时间、地点、参与人

  • 是否需要准备材料

通知策略

  • 会议前 2 小时:发送提醒

  • 会议前 30 分钟:再次提醒(可选)

  • 无会议:不通知

5.2 实现方案

类似邮件检查,可以使用 Google Calendar MCP Server:

npx -y @modelcontextprotocol/server-google-calendar

5.3 配置步骤

步骤 1:创建心跳检查

在 HEARTBEAT.md 添加:

- [ ] 日历:检查未来 24 小时的会议,提前 2 小时提醒

步骤 2:创建 Cron 提醒

对于精确时间的提醒,使用 Cron 更合适:

{  "name": "会议提醒检查",  "schedule": {    "kind": "every",    "everyMs": 3600000  // 每小时检查一次  },  "payload": {    "kind": "agentTurn",    "message": "使用 Google Calendar MCP 查询未来 2-2.5 小时内的会议。如果有,发送提醒:'⏰ 提醒:{会议主题} 将在 2 小时后开始({时间}),地点:{地点}'。",    "timeoutSeconds": 120  },  "sessionTarget": "isolated",  "delivery": {    "mode": "announce"  },  "enabled": true}

5.4 进阶:智能提醒

可以加入更多逻辑:

## 智能提醒规则- 如果是"团队会议",提醒"准备好周报"- 如果是"客户会议",提醒"检查演示材料"- 如果是"面试",提醒"查看候选人简历"- 如果会议地点是"外部",提醒"预留交通时间"- 如果当前时间>20:00,不发送提醒(避免打扰)

这些规则可以写在 HEARTBEAT.md 或任务的 message 中,AI 会理解并执行。

六、实战案例 3:模型额度监控

6.1 需求分析

背景:使用多个 AI 厂商的 API,需要监控剩余额度,避免任务中途失败。

监控对象

  • Qwen Portal(OAuth)

  • Groq(免费额度)

  • DeepSeek(充值额度)

  • 智谱 AI(免费额度)

  • 月之暗面(充值额度)

  • MiniMax(充值额度)

预警阈值

  • 剩余额度 < 20%:发送预警

  • 剩余额度 < 5%:发送紧急预警

  • 额度用完:发送告警

6.2 实现方案

OpenClaw 工作区已有现成的测试脚本:

# 查询额度powershell -File scripts/check-quotas.ps1# 测试模型(同时可检查额度)powershell -File scripts/test-models-minimal.ps1

状态文件memory/model-quota-state.json

6.3 配置步骤

步骤 1:创建 Cron 任务

{  "name": "模型额度监控",  "schedule": {    "kind": "cron",    "expr": "0 20 * * *",    "tz": "Asia/Shanghai"  },  "payload": {    "kind": "agentTurn",    "message": "运行 scripts/check-quotas.ps1,读取 memory/model-quota-state.json。如果有厂商额度低于 20%,通知用户:'⚠️ 额度预警:{厂商} 剩余{百分比}%,建议充值'。如果全部正常,静默结束。",    "timeoutSeconds": 300  },  "sessionTarget": "isolated",  "delivery": {    "mode": "announce"  },  "enabled": true}

步骤 2:配置通知渠道

如果希望额度预警发送到特定渠道(如微信/钉钉),可以在 delivery 中配置 webhook:

"delivery": {  "mode": "webhook",  "to": "https://your-webhook-url.com/alert"}

6.4 状态追踪

额度状态会记录在 memory/model-quota-state.json

{  "lastCheck": "2026-03-31T20:00:00+08:00",  "quotas": {    "qwen": {      "status": "✅ 活跃",      "type": "OAuth",      "limit": "N/A"    },    "groq": {      "status": "⏳ 待配置",      "type": "API Key",      "limit": "免费额度"    },    "deepseek": {      "status": "⏳ 待配置",      "type": "API Key",      "limit": "免费额度"    }  }}

AI 会对比历史数据,只在新出现预警时通知。

七、实战案例 4:Git 仓库状态同步

7.1 需求分析

目标:每天下班前检查 Git 仓库,确保代码已提交。

检查内容

  • 工作区是否有未提交的变更

  • 是否有未推送的提交

  • 是否有需要处理的 merge conflict

通知策略

  • 有未提交变更:提醒"记得提交代码"

  • 有未推送提交:提醒"记得 push 到远程"

  • 一切正常:不通知

7.2 实现方案

使用 exec 工具运行 Git 命令:

# 检查工作区状态git status --porcelain# 检查未推送的提交git log @{u}..# 检查需要拉取的提交git log ..@{u}

7.3 配置步骤

步骤 1:创建心跳检查

在 HEARTBEAT.md 添加:

- [ ] Git:检查工作区仓库状态,有变更才通知

步骤 2:AI 执行逻辑

当心跳触发时,AI 会:

  1. 使用 exec 运行 git status --porcelain

  2. 如果输出为空,说明工作区干净

  3. 如果有输出,提取变更文件列表

  4. 通知用户:"📝 Git 提醒:检测到 {N} 个未提交的文件,记得下班前提交"

步骤 3:可选的 Cron 任务

如果希望固定时间检查(如下班前 18:00):

{  "name": "下班 Git 检查",  "schedule": {    "kind": "cron",    "expr": "0 18 * * 1-5",    "tz": "Asia/Shanghai"  },  "payload": {    "kind": "agentTurn",    "message": "运行 git status --porcelain 和 git log @{u}.. 检查当前工作区。如果有未提交或未推送的变更,通知用户。如果是周五,额外提醒'周末前记得 push 代码'。",    "timeoutSeconds": 120  },  "sessionTarget": "isolated",  "delivery": {    "mode": "announce"  },  "enabled": true}

八、任务调度最佳实践

8.1 避免任务风暴

问题:如果创建了太多定时任务,可能在同一时间触发,导致资源竞争。

解决方案

  1. 错开时间:不要把所有任务都设置在整点

    • ❌ 全部 0 9 * * *

    • ✅ 分散为 0 9 * * *5 9 * * *10 9 * * *

  2. 使用心跳批量检查:把相关检查合并到一次心跳

    • 邮件 + 日历 + 天气 → 一次心跳完成

    • 而不是创建 3 个独立的 Cron 任务

  3. 设置超时:避免任务卡住

"payload": {  "kind": "agentTurn",  "message": "...",  "timeoutSeconds": 300  // 5 分钟超时}

8.2 任务失败处理

问题:任务执行失败怎么办?

策略

  1. 记录日志:使用 cron runs jobId=<id> 查看执行历史

  2. 设置重试:对于关键任务,可以创建备份任务(延迟 5 分钟执行)

  3. 失败通知:在任务 message 中加入"如果执行失败,通知用户"

8.3 资源管理

内存与 Token

  • 心跳在主会话执行,会累积上下文 → 定期清理不需要的记忆

  • Cron 的 isolated 任务独立执行,不占主会话 → 适合长时间任务

  • 使用 cleanup: "delete" 自动清理临时子会话

并发控制

  • 避免同时运行多个 CPU 密集型任务

  • 对于 API 调用,注意厂商的 rate limit

  • 使用 yieldMs 参数避免阻塞

8.4 调试技巧

测试新任务

  1. 先创建禁用状态的任务:"enabled": false

  2. 使用 cron run jobId=<id> 手动执行测试

  3. 确认无误后,更新为 "enabled": true

查看执行日志

# 查看任务历史cron runs jobId=<id># 查看最近 10 次执行cron runs jobId=<idlimit=10

临时禁用任务

# 更新任务,设置为禁用cron update jobId=<id> patch={"enabled"false}

九、总结与行动清单

9.1 核心要点回顾

概念关键点
心跳机制定期检查多项事务,用自然语言配置
Cron 任务精确时间执行,支持 cron 表达式
sessionTargetmain→systemEvent,isolated→agentTurn
任务类型提醒类用 systemEvent,执行类用 agentTurn
失败处理记录日志、设置超时、可选重试

9.2 立即行动清单

今天就能做的(30 分钟):

  • 打开 HEARTBEAT.md,添加你的日常检查清单
  • 创建一个每天早上 9 点的提醒(邮件 + 日历)
  • 创建一个每天晚上 8 点的模型额度检查

本周完成的(2 小时):

  • 配置 Gmail/Calendar MCP Server
  • 创建 Git 状态检查任务
  • 测试所有任务,调整通知策略

进阶优化(持续):

  • 根据实际使用情况,调整检查频率
  • 添加更多个性化检查(如股票/新闻/天气)
  • 建立任务执行日志,分析优化

9.3 常见陷阱

陷阱避免方法
心跳太频繁,打扰用户设置静默时间(23:00-08:00)
Cron 任务太多,难以管理合并相关任务,使用心跳批量检查
任务失败无感知配置失败通知,定期检查执行历史
额度用完任务中断设置额度预警(20%/5% 阈值)
上下文累积太多定期清理 MEMORY.md,使用 isolated 会话