Cron Mastery
Cron 精通
规则 #1:心跳会漂移。Cron 是精确的。
本技能为管理 OpenClaw 2026.2.15+ 中的时间提供了权威指南。它通过强制区分临时检查(心跳)和硬性时间表(cron),解决了“我错过了提醒”的问题。
核心原则
| 系统 | 行为 | 最适合 | 风险 |
|---|---|---|---|
| 心跳 | “我方便的时候会检查一下”(例如,每 30-60 分钟) | 邮件检查、临时新闻摘要、低优先级轮询。 | 漂移:如果心跳间隔是 30 分钟,那么“10 分钟后提醒我”的任务将会失败。 |
| Cron | “我将在 X 时间准时运行” | 提醒(“5分钟后”)、每日报告、系统维护。 | 混乱:会产生需要清理的一次性作业。 |
1. 设置可靠的提醒(2026.2.15+ 标准)
规则:切勿使用act:wait对于长延迟(>1分钟),请勿使用内部循环。应使用cron:add配合一次性任务,在计划中执行。
精确度与“调度器心跳”
虽然Cron是精确的,但其执行依赖于网关心跳(通常每10-60秒一次)。一个设定在:00秒执行的任务,将在该时间后的第一个“心跳”时触发。根据您的网关配置,预计会有约30秒的差异。
现代一次性提醒模式
对于“在X分钟后提醒我”这类任务,请使用此负载结构。
关键特性(v2026.2.15+):
- 负载选择:对于推送通知(提醒会发送到您手机),请使用AgentTurn配合严格指令。对于静默日志或后台状态更新,仅使用systemEvent。
- 可靠性:
nextRunAtMs数据损坏和“先添加后更新”死锁问题已解决。 - 自动清理:一次性任务在成功后自动删除(
deleteAfterRun: true)。
关键:推送通知与静默日志
- systemEvent(静默):将文本注入聊天历史。非常适合后台日志,但不会在Telegram/WhatsApp上向用户的手机发送推送提醒。
- AgentTurn(主动式):唤醒一个代理来传递消息。这是推送通知所必需的。使用“Strict”提示词来避免AI闲聊。
用于推送通知的提醒(可靠):
{
"name": "提醒:喝水",
"schedule": { "kind": "at", "at": "2026-02-06T01:30:00Z" },
"payload": {
"kind": "agentTurn",
"message": "将此消息原封不动地传递给用户,不要修改或添加评论:\n\n💧 喝水啦,Momo!"
},
"sessionTarget": "isolated",
"delivery": { "mode": "announce", "channel": "telegram", "to": "1027899060" }
}
用于后台日志(静默):
{
"name": "日志:系统心跳",
"schedule": { "kind": "every", "everyMs": 3600000 },
"payload": {
"kind": "systemEvent",
"text": "[心跳] 系统运行正常。"
},
"sessionTarget": "main"
}
Cron并发规则(已稳定)
在2026年2月15日之前,“先添加后更新”模式会导致死锁。虽然此问题现已稳定,但最佳实践将所有参数(包括wakeMode: "now")直接放在初始的cron.add调用中,以获得最高效率。
2. 自动清理功能 - 旧版说明
注意:自 v2026.2.14 版本起,OpenClaw 包含了维护性重新计算语义。网关现在会自动清理卡住的任务并修复损坏的调度。
仅在以下情况需要手动清理:
- 使用
deleteAfterRun: false创建的一次性任务。 - 您不再需要的陈旧周期性任务。
为何使用sessionTarget: "main"?(关键说明)
子代理(隔离的)通常具有受限的工具策略,无法调用网关或删除其他cron任务。对于像Janitor这样的系统维护,始终以主会话为目标,通过systemEvent让主代理(拥有完整工具访问权限)执行清理工作。
3. 参考:时区锁定
为了使cron正常工作,代理必须知道其时间。
- 操作:将用户的时区添加到
MEMORY.md中。 - 示例:
时区:开罗(GMT+2) - 验证:如果用户说“晚上9点提醒我”,在安排前确认:“开罗时间晚上9点吗?”
4. 自我唤醒规则(行为性)
问题:如果你说“我会等待30秒”并结束你的回合,你就会进入睡眠状态。没有事件你无法醒来。解决方案:如果你需要跨回合“等待”,你必须安排一个Cron任务。
- 等待时间 < 1 分钟(交互式):仅在你保持工具循环开放时允许(使用
操作:等待)。 - 等待时间 > 1 分钟(异步):使用Cron并设置
唤醒模式:"立即"。
5. 旧版迁移指南
如果你有使用这些模式的旧版cron任务,请更新它们:
| 旧版(2026.2.3之前) | 现代版(2026.2.15+) |
|---|---|
"schedule": {"kind": "at", "atMs": 1234567890} | "schedule": {"kind": "at", "at": "2026-02-06T01:30:00Z"} |
"deliver": true在有效载荷中 | 不需要 -宣布模式处理传递 |
"sessionTarget": "main" | "sessionTarget": "isolated"(默认行为) |
| 需要手动清理幽灵进程 | 一次性任务自动删除(deleteAfterRun: true) |
cron.update之后cron.add | 单步cron.add包含所有属性 |
故障排除
- “我的提醒没有触发”:检查
cron:list。验证在时间戳为未来时间(ISO 8601格式)。确保唤醒模式:"立即"已设置。 - "网关超时(10000毫秒)":如果
cron工具耗时过长(庞大的任务列表或文件锁),就会发生这种情况。- 修复方法1:手动删除
~/.openclaw/state/cron/jobs.json并在其损坏时重启网关。 - 修复方法2:运行手动清理以减少任务数量。
- 修复方法1:手动删除
- "任务已运行但未收到消息":请确保您正在使用严格指令模式配合
agentTurn+announce模式以进行主动通知。 - "提醒消息包含额外评论":子代理正在以对话方式回应。请使用严格提示模式:
"向用户传递此确切消息,不作任何修改或评论:\n\n💧 您的消息内容在此"


微信扫一扫,打赏作者吧~