OpenClaw 定时任务高级编排:从 Cron 表达式到智能工作流调度
为什么需要高级任务编排?
AI Agent 的魅力在于”主动”——不需要等人类发号施令,它自己就知道什么时候该做什么事。但这背后需要一个强大的调度系统。
普通的 Cron 定时器只能做固定周期的重复,而现代 AI 工作流需要的远远不止这些:
- 动态节奏:业务忙时高频检查,闲时自动降频
- 条件触发:只有满足某些条件时才执行任务
- 失败告警:任务挂了必须及时通知
- 多级编排:一个任务的结果决定下一个任务是否执行
OpenClaw 的调度引擎恰好完整覆盖了这些需求。本文将带你从入门到精通,掌握这套高级编排能力。
一、调度核心概念
OpenClaw 的调度系统基于 automations 工具,核心模型是一个 Job:
Job = Schedule + Payload + Delivery + Trigger + Pacing
| 组件 | 作用 | 必填 |
|---|---|---|
| Schedule | 何时触发 | ✅ |
| Payload | 触发后做什么 | ✅ |
| Delivery | 结果送到哪里 | ❌ |
| Trigger | 额外条件守卫 | ❌ |
| Pacing | 动态频率控制 | ❌ |
三种 Schedule 模式
1. At — 一次性执行
适合”3小时后提醒我”的场景:
{
"schedule": {
"kind": "at",
"at": "2026-10-10T09:00:00Z"
}
}
自动清理:成功执行后自动删除,无需手动维护。
2. Every — 固定间隔
适合轮询场景:
{
"schedule": {
"kind": "every",
"everyMs": 1800000
},
"pacing": { "min": "15m", "max": "2h" }
}
加入 pacing 后可动态调节,后文详述。
3. Cron — 日历时间
最常用的模式,支持时区:
{
"schedule": {
"kind": "cron",
"expr": "0 9 * * 1-5",
"tz": "Asia/Shanghai"
}
}
关键规则:表达式写挂钟时间,系统自动按时区转换。不要手动将上海时间转 UTC。
二、高级编排技术
2.1 条件触发器(Trigger Guard)
这是 OpenClaw 调度引擎最强大的特性之一。触发器本质上是一个 条件守卫脚本,只有满足条件时任务才真正执行。
工作原理:
Schedule 触发 → Trigger 脚本执行 → 返回 {fire: true/false} → 决定 Payload 是否运行
实战:仅在工作时间发通知
const now = new Date();
const hour = now.getUTCHours() + 8;
const day = now.getUTCDay();
// 仅在工作日 9:00-18:00 执行
const fire = day >= 1 && day <= 5 && hour >= 9 && hour < 18;
return { fire, state: { lastCheck: Date.now() } };
去重守护(幂等性检查):
const lastEventId = trigger.state?.lastEventId || 0;
const currentEventId = getLatestEventId();
if (currentEventId <= lastEventId) {
return { fire: false };
}
return {
fire: true,
message: `New event #${currentEventId}`,
state: { lastEventId: currentEventId }
};
2.2 动态节奏控制(Pacing)
固定周期的最大问题是:业务高峰期来不及处理,低谷期又在空转。
Pacing 机制让任务自己调节执行节奏:
{
"schedule": { "kind": "every", "everyMs": 60000 },
"pacing": { "min": "30s", "max": "30m" }
}
在任务内部调整节奏:
const pendingItems = await checkQueueDepth();
if (pendingItems > 100) {
await automations({ action: "next_check", in: "30s" });
} else if (pendingItems === 0) {
await automations({ action: "next_check", in: "30m" });
} else {
await automations({ action: "next_check", in: "5m" });
}
典型场景:
- 邮件轮询:无新邮件时 30 分钟查一次,有邮件时 1 分钟
- 文件监听:无变化时每小时检查,检测到修改立即处理后续批
- 价格监控:波动小时降低频率,波动大时加速
2.3 多目标投递(Delivery)
不同的任务结果需要送到不同的地方:
{
"delivery": {
"mode": "announce",
"channel": "discord",
"to": "123456789"
}
}
| 模式 | 行为 | 适用场景 |
|---|---|---|
announce |
结果发送到指定频道 | 通知、报告 |
none |
静默执行 | 后台维护、数据同步 |
webhook |
POST 到指定 URL | 对接外部系统 |
失败告警链路:OpenClaw 支持多级失败处理——连续 2 次失败触发告警、1 小时内不重复告警、主投递失败后走备选路由。
{
"delivery": {
"mode": "announce",
"bestEffort": true,
"failureDestination": {
"mode": "webhook",
"to": "https://alert.example.com/critical"
}
},
"failureAlert": {
"after": 3,
"mode": "announce",
"to": "admin-channel"
}
}
2.4 Stream 模式:进程监控
除了时间触发,OpenClaw 还支持流式监控——跟踪一个后台进程的输出,匹配到关键字时自动触发任务:
{
"schedule": {
"kind": "stream",
"command": ["tail", "-f", "/var/log/app.log"],
"mode": "match",
"match": "ERROR|CRITICAL"
}
}
三、多任务编排实战
3.1 定时链式任务
一个经典的数据流水线编排:
数据采集(每 5 分钟) → 数据清洗(采集完成后) → 数据入库(清洗完成后) → 报表生成(入库完成后)
实现方式:任务之间通过状态文件或数据库标记通信。
3.2 智能告警聚合
高频率告警会产生告警风暴。使用 Trigger 的 state 做聚合:
const state = trigger.state || { count: 0, firstSeen: 0, lastAlert: 0 };
const now = Date.now();
if (hasAlertCondition()) {
state.count++;
if (state.count === 1) state.firstSeen = now;
if (state.count >= 3 || (now - state.firstSeen > 300000)) {
const fire = (now - (state.lastAlert || 0)) > 600000;
if (fire) state.lastAlert = now;
return {
fire,
message: `聚合告警: ${state.count} 次事件`,
state: { ...state, count: 0, firstSeen: 0 }
};
}
}
return { fire: false, state };
四、性能与最佳实践
🔥 黄金法则
| 原则 | 说明 |
|---|---|
| 触发器轻量化 | Trigger 只有 30s/5 次调用,放重逻辑在这里会超时 |
| 状态用 text 不用 memory | trigger.state 是自包含的,不要在触发器里写 memory |
| 一次任务只关注一件事 | 单一职责:一个 cron job 只做一件事 |
| 善用 bestEffort | 非关键任务设 bestEffort,失败不影响重试计数 |
| 心率先于 Cron | 同频次多检查用 Heartbeat 合并,减少 API 调用 |
⚠️ 常见陷阱
陷阱 1:时区转换错误
// ❌ 错误:手动转 UTC
"expr": "0 1 * * *" // 以为是北京时间 9:00,其实是 UTC 1:00
// ✅ 正确:写挂钟时间,标注时区
"expr": "0 9 * * *",
"tz": "Asia/Shanghai"
陷阱 2:触发器状态不持久化 — Trigger state 只在内存中,系统重启后会重置。需要跨重启的计数器请用外部存储。
陷阱 3:忘记设置 one-shot 自动清理 — kind: "at" 的任务默认成功执行后自动删除。但需要严格可靠投递时不要设 bestEffort。
🏗️ 实际架构建议
对于稍微复杂的生产环境,推荐这种分层结构:
┌──────────────────┐
│ Gateway Scheduler │ ← 核心调度引擎
├──────────────────┤
│ cron jobs │ ← 固定时间任务
│ stream watchers │ ← 进程监控
│ heartbeat loop │ ← 综合性检查
├──────────────────┤
│ Main Agent │ ← 任务执行体
│ └── Subagents │ ← 复杂任务子代理
├──────────────────┤
│ Triggers │ ← 条件守卫
│ Pacing │ ← 动态节奏
│ Delivery/Failure │ ← 投递 & 容错
└──────────────────┘
五、实际案例:自动化运维机器人
最后组装一个完整的实战案例——智能运维检查机器人:每5分钟检查服务器健康,仅工作时间执行,无事时30分钟、发现问题立即加速,连续失败通知管理员,结果发送到运维群。
{
"name": "运维健康检查",
"schedule": { "kind": "every", "everyMs": 300000 },
"trigger": {
"script": "const h = new Date(Date.now()+8*3600000).getHours(); const d = new Date().getUTCDay(); return {fire: d>=1 && d<=5 && h>=8 && h<20};"
},
"pacing": { "min": "5m", "max": "30m" },
"delivery": {
"mode": "announce",
"failureDestination": { "mode": "webhook", "to": "https://hook.example.com/ops-alert" }
},
"payload": {
"message": "请检查服务器 + Docker 容器健康状态,报告异常项。"
},
"failureAlert": { "after": 2, "mode": "announce" }
}
总结
OpenClaw 的调度引擎远不止是一个 Cron 替代品。它提供的条件触发器、动态节奏、失败告警、多模式投递等能力,让 AI Agent 能够像一个真正的运维工程师一样,根据实际情况自主调整工作节奏。
| 能力 | 一句话总结 |
|---|---|
| Cron / At / Every | 三种基础定时模式覆盖所有需求 |
| Trigger | 条件守卫,避免空执行和重复处理 |
| Pacing | 动态调频,忙时紧、闲时松 |
| Stream | 进程级事件监控 |
| Delivery | 结果灵活投递 + 自动容错 |
掌握这套编排能力,你就可以构建出越来越”主动”的 AI Agent——不是等着被调用,而是智能地管理自己的工作节奏。