Install
openclaw skills install @thcjp/cron-scheduler-pro定时调度专家为 AI Agent 提供本地优先、无云依赖的周期任务调度能力。它把"每隔X做Y"的意图固化为可信任的执行契约,支持每日/每周/每月/自定义间隔四种调度类型,并内置时区锁定、一次性任务自动清理、并发写安全、下次运行预览与失败重试。 核心能力:周期任务捕获(add_job)、下次运行预览(next_ru...
openclaw skills install @thcjp/cron-scheduler-pro功能说明: 本技能涵盖 scheduler 等核心能力。
把"每两小时检查一次收件箱"这种模糊意图,变成可信任、可审计、可预览的执行契约。本技能解决五个核心痛点:时区漂移("9点"到底是哪个时区)、任务漏跑(调度器没跑或跑了不知道)、一次性任务堆积(提醒完了任务不清理)、并发死锁(add 后立刻 update 导致锁冲突)、失败无感知(任务挂了没人知道).
所有数据本地存储,按职责分文件:
$HOME/.skill-platform/workspace/memory/cron/
├── jobs.json # 任务定义(active/paused/archived)
├── runs.json # 运行历史(最近100条)
├── stats.json # 统计数据(成功率、平均耗时)
└── .lock # 文件锁(并发写保护)
无外部同步,无云存储,无第三方 cron 服务.
active ──pause──→ paused ──resume──→ active
│ │
└──────────archive──────────────────→ archived
| 状态 | 含义 | 是否触发 |
|---|---|---|
active | 调度生效中 | 是 |
paused | 临时暂停 | 否 |
archived | 不再活跃,保留历史 | 否 |
| 类型 | 示例 | 说明 |
|---|---|---|
daily | 每天 09:00 | 固定每日时刻 |
weekly | 每周一 10:00 | 固定每周时刻 |
monthly | 每月1号 08:00 | 固定每月时刻 |
interval | 每 2 小时 | 固定间隔 |
once | 2026-07-18 15:30 | 一次性(成功后自动归档) |
"每天 9 点提醒我喝水"——9 点是东京还是纽约?这是漏跑最高频的原因.
首次创建任务前,必须确认时区并写入记忆:
python3 tools/cron/set_timezone.py --timezone "Asia/Shanghai"
写入 MEMORY.md:
Timezone: Asia/Shanghai (UTC+8)
# add_job.py 内部逻辑
def validate_timezone(job):
tz = get_stored_timezone()
if not tz:
raise SchedulerError(
"时区未锁定。请先运行 set_timezone.py 设置时区。\n"
"否则 '9点' 的含义将不确定,导致漏跑。"
)
if job.schedule_type == 'daily':
# 确认: "9点 Shanghai 时间?"
confirm = f"将按 {tz} 时区调度:每天 {job.time}。确认?"
if not user_confirm(confirm):
return None
对于跨时区团队,任务可指定独立时区:
python3 tools/cron/add_job.py \
--name "daily-standup" \
--type daily \
--time "09:00" \
--timezone "Asia/Tokyo" \
--task "发起每日站会提醒"
原始方案中一次性提醒跑完后仍留在 jobs.json,时间一长堆积成垃圾。本技能强制:
# 一次性任务定义
job = {
"name": "remind-water",
"type": "once",
"at": "2026-07-18T15:30:00+08:00",
"task": "提醒喝水",
"delete_after_run": True # 强制 True,不可关闭
}
运行成功后:
active 移到 archivedruns.json# 手动清理过期归档
python3 tools/cron/cleanup.py --older-than 7d
原始方案的 add-then-update 模式在并发时会死锁。本技能用文件锁解决:
import fcntl
# ...
def write_jobs(jobs_data):
lock_path = CRON_DIR / ".lock"
with open(lock_path, "w") as lock_file:
# 阻塞式获取排他锁
fcntl.flock(lock_file, fcntl.LOCK_EX)
try:
# 原子写入:写临时文件 → rename
tmp = CRON_DIR / "jobs.json.tmp"
tmp.write_text(json.dumps(jobs_data, indent=2))
tmp.replace(CRON_DIR / "jobs.json")
finally:
单步创建原则:所有属性在 add_job 时一次传入,禁止"先 add 再 update"两步操作.
# 运行失败时的重试策略
RETRY_CONFIG = {
"max_retries": 3,
"backoff": [60, 300, 900], # 1分钟、5分钟、15分钟
"circuit_breaker": {
"threshold": 5, # 连续失败5次
"action": "pause", # 自动暂停任务
"notify": True # 通知用户
}
}
熔断触发后:
pausedruns.jsonruns.json 保留最近 100 条运行记录:
{
"job_name": "inbox-check",
"started_at": "2026-07-18T10:00:00+08:00",
"finished_at": "2026-07-18T10:00:03+08:00",
"duration_ms": 3200,
"status": "success",
"retries": 0,
"error": null
}
# 查看统计
python3 tools/cron/stats.py
调度统计 (最近 7 天)
═══════════════════════════════════════
总运行: 84 次
成功: 81 次 (96.4%)
失败: 3 次
平均耗时: 4.2s
# ...
失败详情:
inbox-check 2026-07-16 14:00 网络超时 (已重试2次后成功)
daily-briefing 2026-07-15 09:00 LLM 调用失败 (已熔断暂停)
不要在心跳里做昂贵检查,改为调度任务:
# 替代每 30 分钟心跳检查收件箱
--name "inbox-check" --type interval --every "2h" \
--task "检查收件箱并汇总"
# ...
# 心跳只做轻量的"该跑什么了"
python3 tools/cron/next_run.py --due-only
--name "meeting-reminder" \
--type once \
--at "2026-07-18T15:25:00+08:00" \
--task "5 分钟后开始项目评审会议,会议室 A"
# 提醒后自动归档,无需手动清理
--name "daily-report" \
--type daily \
--time "18:00" \
--timezone "Asia/Shanghai" \
--task "生成今日工作日报并保存到 reports/目录"
--name "api-health" \
--type interval \
--every "5m" \
--task "探测 API 健康端点,失败则告警" \
--max-retries 3 \
--circuit-breaker 5
Q:任务到时间了没跑?
A:检查四点:① 任务是否 active;② 时区是否正确(next_run.py 显示的下次时间对吗);③ Agent 心跳是否在运行(本引擎依赖 Agent 唤醒);④ 是否被熔断暂停(看 stats.py).
Q:一次性任务能取消吗?
A:能。pause_job.py 或 archive_job.py 在触发前取消。若已触发但任务还在执行,无法中断.
Q:jobs.json 损坏怎么办?
A:本技能写入用临时文件+rename 原子操作,正常不会损坏。若意外损坏,runs.json 可部分重建任务历史。建议定期 cleanup.py --backup.
Q:多个 Agent 共享调度吗?
A:默认按用户隔离(每人一份 jobs.json)。共享需挂载共享目录并依赖文件锁,但心跳驱动仍是各 Agent 独立.
Q:interval 任务的起始点怎么算?
A:从创建时刻起算。如 10:00 创建"每 2 小时",则 12:00、14:00... 触发。若需对齐到整点,用 --align 参数.
Q:如何迁移到新机器?
A:复制整个 cron/ 目录即可。时区信息在 MEMORY.md,一并复制.
next_run.py --due-only(只查到期任务),不做全量扫描.runs.json 默认保留 100 条,超出自动裁剪最旧.stats.py 不实时计算,用缓存结果,每 10 次运行刷新一次.next_run.py 一次计算所有任务的下次运行,避免逐个查询.scan.sh 注册为 interval 任务.| 依赖项 | 类型 | 是否必需 | 获取方式 |
|---|---|---|---|
| Python 3 | 运行时 | 必需 | 系统自带或 python.org |
| fcntl | 标准库 | Linux/Mac 必需 | Python 自带 |
| msvcrt | 标准库 | Windows 必需 | Python 自带 |
| LLM API | API | 必需 | 由 Agent 内置 LLM 提供 |
执行核心功能执行操作,使用input_params参数进行配置.
处理: 解析核心功能执行的输入参数,完成核心逻辑,返回格式化结果.
输出: 返回核心功能执行的响应数据,包含返回码、数据和处理记录.
input_params参数,支持创建/查询/导出操作执行参数配置与调用操作,使用config_options参数进行配置.
处理: 解析参数配置与调用的输入参数,完成核心逻辑,返回格式化结果.
输出: 返回参数配置与调用的响应数据,包含返回码、数据和处理记录.
config_options参数,支持修改/重置/导入操作执行扩展能力3操作,使用param_3参数进行配置.
处理: 解析扩展能力3的输入参数,完成核心逻辑,返回格式化结果.
输出: 返回扩展能力3的响应数据,包含返回码、数据和处理记录.
param_3参数,支持创建/查询/修改操作
能力覆盖范围:能力范围包括以下关键词:本地优先的周期任、务引擎、并发安全、告别漏跑与堆积、Use、when、模型调用、智能对话、LLM、应用时使用、不适用于需要、确定性的关键决策等。这些关键词对应description中声明的使用场景,均已在上述能力点中提供对应的操作支持.用户需要每天 9 点生成工作日报,要求时区锁定防止漂移:
输入: 用户说"每天9点生成工作日报",时区 Asia/Shanghai
处理:
1. 首次创建前强制时区确认,写入 MEMORY.md
2. 创建 daily 类型任务,schedule.time = "09:00"
3. 文件锁保护原子写入 jobs.json
4. 记录到 runs.json 供后续统计
输出: 任务 "daily-report" 创建成功
类型: daily | 时间: 09:00 (Asia/Shanghai)
下次运行: 2026-07-25T09:00:00+08:00
状态: active
用户需要 30 分钟后提醒关火,任务执行后自动归档:
输入: 用户说"30分钟后提醒我关火"
处理:
1. 创建 once 类型任务,at = 当前时间+30分钟
2. delete_after_run 强制 True,不可关闭
3. 到时间触发后:active → archived
4. 保留 7 天运行记录后物理删除
输出: 任务 "remind-stove" 创建成功
类型: once | 触发: 2026-07-24T16:00:00+08:00
执行后状态: archived(7天后自动物理删除)
runs.json 保留执行记录
| 操作场景 | 手动耗时 | 自动化耗时 | 效率提升 |
|---|---|---|---|
| 文件解析与提取 | 5-10分钟/个 | <5秒/个 | 60-120x |
| 批量文件处理(100个) | 8-16小时 | <5分钟 | 96-192x |
| API调用与响应解析 | 2-3分钟/次 | <1秒/次 | 120-180x |
| 多接口数据聚合 | 15-30分钟 | <10秒 | 90-180x |
| 命令执行与结果收集 | 3-5分钟/次 | <2秒/次 | 90-150x |
| 重复任务批量执行 | 因任务而异 | 线性缩减 | 5-50x |
| 错误排查与修复 | 10-30分钟 | <30秒 | 20-60x |
| 对比维度 | 定时调度专家 | 传统手动方式 | 通用脚本工具 |
|---|---|---|---|
| 自动化程度 | 全流程自动 | 完全手动 | 部分自动 |
| 错误处理 | 内置错误恢复 | 依赖人工经验 | 基本try-catch |
| 可复用性 | 参数化配置 | 一次性脚本 | 模板化 |
| 安全合规 | 内置安全检查 | 无安全保障 | 无安全保障 |
| 适用场景 | "本地优先的周期任务引擎,时区锁定、一次性任务自清理、并发安全,告别漏跑与堆积. | 通用场景 | 通用场景 |
针对定时调度专家使用中可能遇到的常见问题,提供以下排查方案:
| 错误类型 | 原因分析 | 解决方案 |
|---|---|---|
| API认证失败(401) | API密钥错误或过期 | 检查密钥配置,重新生成token |
| 接口限流(429) | 请求频率超出限制 | 降低调用频率,启用重试退避策略 |
| 响应超时(504) | 网络延迟或服务端负载过高 | 增加超时阈值,检查网络连接 |
| 文件不存在 | 路径错误或文件未创建 | 检查路径拼写,确认文件已生成 |
| 文件格式不支持 | 扩展名不在支持列表中 | 转换为支持的格式后重试 |
| 权限不足 | 当前用户无读写权限 | 检查文件权限,以管理员身份运行 |
| 命令执行失败 | 参数错误或环境依赖缺失 | 检查命令语法,确认依赖已安装 |
| 进程超时 | 命令执行时间过长 | 增加超时设置,优化命令参数 |
| 网络连接失败 | DNS解析失败或防火墙拦截 | 检查网络配置,确认代理设置 |
A1: "本地优先的周期任务引擎,时区锁定、一次性任务自清理、并发安全,告别漏跑与堆积.。定时调度专家为 AI Agent 提供本地优先、无云依赖的周期任务调度能力。它。支持文本指令和结构化参数输入,具体格式参考使用流程章节。
A2: 是的,部分功能需要配置对应平台的API Key。请在依赖说明章节查看具体要求,并通过环境变量安全配置。
A3: 检查命令参数是否正确,确认运行环境支持exec能力。如遇权限问题,请参照错误处理章节排查。