定时任务与提醒:Cron + Heartbeat 自动化

博客1周前发布 骆驼
315 00

OpenClaw 不只是一个被动回答问题的 AI —— 通过 Cron 定时任务和 Heartbeat 心跳机制,它可以主动执行任务、发送提醒、检查状态。这篇文章介绍如何让你的 AI 助手变得「主动」。

Cron 系统介绍

OpenClaw 内置了一套灵活的 Cron 系统,支持三种调度类型:

调度类型

1. at —— 一次性定时任务

在指定时间点执行一次,执行后自动删除。适合「20分钟后提醒我」这类场景。

schedule:  type: at  time: "2025-01-15T09:00:00Z"    # ISO 8601 格式

2. every —— 间隔重复任务

按固定时间间隔重复执行。

schedule:  type: every  interval: 30m      # 每30分钟  # 支持的单位:s(秒)、m(分)、h(小时)、d(天)

3. cron —— Cron 表达式

使用标准的 cron 表达式,适合复杂的定时规则。

schedule:  type: cron  expression: "0 9 * * 1-5"    # 工作日每天早上9点

常用 cron 表达式速查:

表达式含义
0 9 * * *每天早上 9:00
0 9 * * 1-5工作日早上 9:00
*/30 * * * *每 30 分钟
0 0 1 * *每月 1 号零点
0 8,20 * * *每天 8:00 和 20:00

Payload 类型

Cron 任务触发时,发送的 payload 有两种类型:

systemEvent —— 系统事件

向指定渠道发送一条系统消息,Agent 会在该渠道上下文中处理:

payload:  type: systemEvent  channel: telegram  target: "123456789"          # 目标用户/群组 ID  message: "请检查今天的未读邮件并汇总"

agentTurn —— Agent 内部执行

不通过任何渠道,直接在 Agent 的 session 中执行任务。适合后台作业:

payload:  type: agentTurn  agent: main  prompt: "检查服务器健康状态,如果有异常通过 Telegram 通知我"

创建定时任务

通过对话创建

最直观的方式是直接告诉你的 AI 助手:

你:每天早上8点给我发一份天气预报AI:好的,我已创建定时任务。每天早上8:00 会通过当前渠道发送天气预报。

Agent 会调用内部 API 创建 cron 任务。

通过配置文件创建

在 config.yaml 中预定义 cron 任务:

# config.yamlcron:  jobs:    morning-brief:      schedule:        type: cron        expression: "0 8 * * *"           # 每天早上8点      payload:        type: systemEvent        channel: telegram        target: "123456789"        message: |          早安!请为我整理今天的早报:          1. 查看未读邮件摘要          2. 今日日程提醒          3. 今日天气      agent: main      timezone: Asia/Shanghai     weekly-review:      schedule:        type: cron        expression: "0 20 * * 5"           # 每周五晚上8点      payload:        type: systemEvent        channel: whatsapp        target: "8613800138000@s.whatsapp.net"        message: "请帮我回顾本周的工作记忆,总结本周要点和下周计划"      agent: main      timezone: Asia/Shanghai     server-check:      schedule:        type: every        interval: 1h                        # 每小时      payload:        type: agentTurn        agent: main        prompt: "检查服务器状态,如果 CPU > 90% 或磁盘 > 85% 则通过 Telegram 通知我"

通过 CLI 创建

# 创建一次性提醒(20分钟后)openclaw cron create \  --schedule '{"type":"at","time":"2025-01-15T09:20:00Z"}' \  --payload '{"type":"systemEvent","channel":"telegram","target":"123456789","message":"会议开始了!"}' \  --agent main # 列出所有定时任务openclaw cron list # 删除任务openclaw cron delete morning-brief

Heartbeat 心跳机制

Heartbeat 是 OpenClaw 的另一个主动机制。它定期「唤醒」Agent,让 Agent 决定是否需要做些什么。

工作原理

  1. Gateway 按配置的间隔(默认 30 分钟)向 Agent 发送心跳
  2. Agent 收到心跳后读取 HEARTBEAT.md,根据清单决定是否有工作要做
  3. 如果无事可做,Agent 回复 HEARTBEAT_OK
  4. 如果有事要做,Agent 执行任务并通过渠道发送消息

配置 Heartbeat

在 config.yaml 中配置心跳间隔:

# config.yamlagents:  list:    main:      heartbeat:        enabled: true        interval: 30m            # 每30分钟触发一次        prompt: "Read HEARTBEAT.md if it exists (workspace context). Follow it strictly. Do not infer or repeat old tasks from prior chats. If nothing needs attention, reply HEARTBEAT_OK."

HEARTBEAT.md 配置

在 Agent 工作空间中创建 HEARTBEAT.md,定义心跳时要检查的事项:

# HEARTBEAT.md - 心跳检查清单 ## 检查项目(轮流检查,不要每次都全做) ### 邮件检查(每2-3次心跳做一次)- 检查未读邮件- 重要邮件通过 Telegram 通知 ### 日程提醒- 检查未来2小时内的日历事件- 有即将到来的会议则通过 WhatsApp 提醒 ### 天气预警- 如果未来几小时有雨,提醒带伞- 极端天气预警 ### 系统健康- 检查磁盘空间- 检查重要服务运行状态 ## 规则- 深夜(23:00-07:00)不要打扰,除非紧急- 每次只检查1-2项,轮流来- 在 memory/heartbeat-state.json 记录上次检查时间

心跳状态追踪

Agent 可以在 memory/heartbeat-state.json 中记录检查状态:

{  "lastChecks": {    "email": "2025-01-15T08:30:00Z",    "calendar": "2025-01-15T08:00:00Z",    "weather": "2025-01-15T07:00:00Z",    "system": "2025-01-14T20:00:00Z"  },  "lastNotification": "2025-01-15T08:30:00Z"}

这样 Agent 就能知道哪项检查「该轮到了」。

Heartbeat vs Cron:如何选择?

特性HeartbeatCron
触发方式固定间隔唤醒精确时间点触发
灵活性Agent 自行决定做什么预定义的固定任务
上下文有会话上下文独立执行
适用场景巡检、轮询、弹性任务精确定时、固定流程
Token 消耗每次都消耗(即使无事可做)只在触发时消耗

最佳实践:

  • 将多个轮询类检查合并到 HEARTBEAT.md,减少 API 调用
  • 精确定时(如”每周一早9点发周报”)用 Cron
  • 弹性检查(如”有空就看看邮箱”)用 Heartbeat

实际案例

案例1:每日早报

# config.yamlcron:  jobs:    daily-brief:      schedule:        type: cron        expression: "30 7 * * *"      payload:        type: systemEvent        channel: whatsapp        target: "8613800138000@s.whatsapp.net"        message: |          早安!请为我准备今日早报:          1. 搜索今天的科技新闻头条(3-5条)          2. 查看今天的天气(上海)          3. 查看我今天的日历安排          4. 用简洁的格式整理,加上 emoji      agent: main      timezone: Asia/Shanghai

案例2:定时检查邮件

<!-- HEARTBEAT.md 中添加 --> ### 邮件监控(每次心跳都检查)- 使用邮件工具检查未读邮件- 如果有标记为重要的邮件,立刻通知- 普通邮件积累到3封以上再汇总通知- 记录在 memory/heartbeat-state.json

案例3:会议提醒

cron:  jobs:    meeting-check:      schedule:        type: every        interval: 15m      payload:        type: agentTurn        agent: main        prompt: |          检查日历中未来30分钟内的会议。          如果有即将开始的会议:          1. 通过 Telegram 发送提醒,包含会议名称、时间、链接          2. 如果有会议文档,提前整理要点          如果没有会议,不做任何事。

案例4:服务器自愈

cron:  jobs:    self-heal:      schedule:        type: every        interval: 5m      payload:        type: agentTurn        agent: main        prompt: |          检查以下服务状态:          - docker ps 查看容器是否正常          - curl localhost:8080/health 检查应用健康          如果有服务异常:          1. 尝试重启(docker restart)          2. 通过 Telegram 通知我处理结果          如果一切正常,不做任何事。

调试与排错

# 查看当前所有 cron 任务openclaw cron list # 查看 cron 执行日志docker compose logs -f | grep "cron" # 手动触发心跳测试openclaw heartbeat trigger --agent main # 查看心跳日志docker compose logs -f | grep "heartbeat"

常见问题:

  • 时区问题:确保 timezone 设置正确,否则任务会在错误的时间触发
  • Token 消耗:Heartbeat 每次都消耗 token,间隔不宜太短(建议 ≥ 15分钟)
  • 重复通知:在 HEARTBEAT.md 中明确规则,避免同一信息反复通知
© 版权声明

相关文章

暂无评论

none
暂无评论...