定时任务编排器
> Agent 最值钱的能力:你睡觉时它还在干活。
> 但定时任务的坑(时区/重叠/静默失败)比一次性执行多 10 倍——这个引擎帮你全防住。
Use when(什么时候用我)
- Agent 需要定时执行(每日报告/每小时巡检/每周采集)
- 多步骤任务链(抓取→分析→生成→发布)
- 任务依赖(B 必须在 A 完成后)
- 失败需要自动重试+告警(不是默默死掉)
- 需要幂等保证(重试不产生重复副作用)
Triggers include
「定时任务」「cron」「编排」「自动化调度」「任务链」「定时报告」「巡检」「重试」「依赖」「幂等」
生产级六大防护(血的教训)
1. 时区陷阱
- cron 默认时区可能不是你以为的——永远显式声明时区
- "每天0点"在跨时区服务器 = 你好几天算错一天
- 对策:所有调度注明时区(如
Asia/Shanghai),日志打绝对时间戳
2. 重叠执行防护
- 上次任务还没跑完,下次又启动 = 双胞胎互相踩
- 对策:锁文件/心跳标记——上一轮未结束就跳过本轮并告警
3. 静默失败检测(最重要)
- 最危险的失败是不报错的失败——任务跑了但没产出
- 对策:每轮无条件落盘状态文件(mtime=最后真实执行时间);检查方对比 mtime 判断"是否真的在跑"
- 退出码语义化:
0正常/1有异常/2停摆自证/3取数失败(不许都报"跑了")
4. 重试与退避
- 失败重试 ≤3 次,间隔指数退避(1min→5min→30min)
- 连续失败 N 次 → 停摆告警(不再无限重试烧资源)
5. 幂等保证
- 重试不产生重复副作用:先查"今天是否已执行过"(状态文件/去重键)
- 副作用操作(发布/发送/扣款)前必有幂等检查
6. 任务链编排
A(抓取) → B(分析,依赖A) → C(发布,依赖B)
任一环节失败:
① 下游不启动(不带着坏数据跑)
② 上游产物保留(便于人工检查)
③ 告警含"卡在哪一环"
调度表达(人类可读)
每天 09:00(Asia/Shanghai):日报生成
每 6 小时:巡检任务
每周一 10:00:周报
每月 1 日:月度归档
与普通"闹钟"的区别
| 能力 | 普通定时 | 本引擎 |
|---|---|---|
| 重叠防护 | 无 | ✅ 锁+心跳 |
| 静默失败 | 不知道 | ✅ mtime自证+退出码语义 |
| 幂等 | 无 | ✅ 执行前检查 |
| 任务链 | 手动串 | ✅ 依赖编排+失败传播 |
| 告警 | 无/全部 | ✅ 分级(异常/停摆/取数失败) |
安全红线
- 定时任务涉及金钱/发布类操作必须走幂等检查
- 停摆必须告警(宁可吵,不可静默)
- 调度配置变更留版本记录
文件结构
scheduler-orchestrator/
├── SKILL.md # 本文件
├── references/
│ └── failure-playbook.md # 六类失败场景处置手册
└── scripts/
└── health_selfcheck.py # 任务健康自检(mtime对比)
版本历史
- v1.0.0(2026-10-15):首发。六大防护+退出码语义+任务链编排。