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——不是等着被调用,而是智能地管理自己的工作节奏。