绝大多数 OpenClaw 使用教程只简单提一句「支持自然语言创建定时任务」,完全不讲解底层调度运行逻辑、持久化文件存储规则,Docker 部署用户经常找不到定时任务配置文件、定时触发时间错乱、容器重启任务丢失等问题无从排查。
本文从底层实现逻辑切入,完整拆解 OpenClaw 进程内置 Cron 调度器运行机制,重点覆盖 Docker 容器场景下 jobs.json 文件宿主机路径定位全套排查命令,逐条解析任务配置文件全部字段含义,区分一次性定时、固定间隔、标准 Cron 表达式三种调度模式,同时说明会话隔离、时区校准、任务执行载体等容易踩坑的细节,所有查询、定位、配置方式均可直接复制落地。
一、OpenClaw 内置 Cron 调度底层实现原理
OpenClaw 并未依赖第三方定时调度中间件,所有定时逻辑全部内置在网关进程内部,属于进程内存级轻量调度方案,完整运行链路如下:
- 内存调度器常驻:网关启动时自动加载
cron/jobs.json内全部任务至内存,生成独立调度管理模块; - 周期时间推演:调度器持续轮询,根据任务配置的调度规则(间隔 / 标准 Cron / 一次性定点)实时计算每一条任务的下一次执行时间戳;
- 到达触发投递:系统时间匹配
nextRunAtMs毫秒时间戳后,将完整任务载荷投递至内部执行队列; - 线程池异步执行:由进程内置线程池 / 协程队列接收任务,按照配置的会话模式调用对应 Agent 执行指令;
- 状态持久化回写:任务执行完毕后,自动更新
state字段内上次运行时间、运行状态、执行耗时、下次触发时间,同步写入本地 jobs.json 持久化保存,容器重启不会丢失任务。
核心优势:无需额外部署 Crond、XXL-Job 等外部定时组件,开箱即用;短板为进程级调度,网关完全停止运行期间会跳过到期任务,重启后自动按规则重新计算下一轮执行时间。
二、Cron 任务持久化存储规则(Docker 部署重点)
1. 文件固定路径逻辑
OpenClaw 定时任务数据统一存放于程序数据根目录下固定相对路径,后半段路径为代码硬编码,不可自定义修改:
固定后缀路径:cron/jobs.json
完整拼接规则:程序数据根目录 + cron/jobs.json
程序默认数据根目录读取优先级:
- 读取系统环境变量
$HOME,默认存放.openclaw文件夹; - Docker 容器内默认 HOME 路径为
/home/node,容器内完整任务文件路径固定为:/home/node/.openclaw/cron/jobs.json
2. Docker 环境宿主机路径定位全套排查命令
容器部署场景下,任务文件真实宿主机路径由数据卷绑定挂载规则决定,分两步精准定位:
步骤 1:查看容器基础挂载概览
bash
运行
docker ps --format 'table {{.Names}}\t{{.Image}}\t{{.Command}}\t{{.Mounts}}'
输出可快速筛选 OpenClaw 网关容器名称。
步骤 2:完整导出容器挂载、环境变量、启动参数
将命令内容器名替换为自身环境名称执行:
bash
运行
docker inspect openclaw-docker-openclaw-gateway-1 --format 'Name={{.Name}}
Cmd={{json .Config.Cmd}}
Entrypoint={{json .Config.Entrypoint}}
Env={{json .Config.Env}}
Binds={{json .HostConfig.Binds}}
Mounts={{json .Mounts}}'
关键字段解读
Binds/Mounts绑定挂载映射示例输出:["/root/openclaw-docker/data/.openclaw:/home/node/.openclaw:rw"]映射关系拆解:
- 宿主机源目录:
/root/openclaw-docker/data/.openclaw - 容器内目标目录:
/home/node/.openclaw - 宿主机任务文件真实路径:
/root/openclaw-docker/data/.openclaw/cron/jobs.json
Env环境变量关键参数:"HOME=/home/node"确认程序默认数据目录根路径,佐证容器内.openclaw存储根目录位置; 代理、时区等环境变量不会影响定时任务文件存储路径,仅作用于 Agent 执行指令阶段。
三、jobs.json 全字段精细化解析
文件顶层分为版本标识与任务数组两大模块,每一条任务为独立 JSON 对象,覆盖调度、权限、会话、载荷、运行状态全维度配置,附标准完整示例:
json
{
"version": 1,
"jobs": [
{
"id": "UUID-EXAMPLE-0001",
"agentId": "main",
"name": "定时执行脚本任务(示例)",
"enabled": true,
"createdAtMs": 1700000000000,
"updatedAtMs": 1700003600000,
"schedule": {
"kind": "every",
"everyMs": 43200000
},
"sessionTarget": "isolated",
"wakeMode": "next-heartbeat",
"payload": {
"kind": "agentTurn",
"message": "执行 bash /home/node/task.sh \"关键词参数\" 2"
},
"state": {
"nextRunAtMs": 1700043200000,
"lastRunAtMs": 1700003600000,
"lastStatus": "ok",
"lastDurationMs": 16204
}
}
]
}
1. 顶层基础字段
version:配置文件格式版本号,用于程序升级时自动迁移旧版任务数据,不可手动修改;jobs:数组容器,存储所有定时任务条目,单条任务独立配置。
2. 任务基础元信息
id:全局唯一 UUID,系统自动生成,作为任务唯一标识,禁止手动修改;agentId:指定执行该定时任务的 Agent 标识,多 Agent 场景可分配至次级代理;name:任务自定义展示名称,用于仪表盘识别、日志区分;enabled:任务启停开关,false 时调度器直接跳过该任务,不再参与时间计算;createdAtMs / updatedAtMs:毫秒级时间戳,分别记录任务创建、最后一次修改时间,系统自动维护。
3. schedule 调度规则(三种核心类型)
调度模块区分 3 种触发模式,适配一次性、轮询、标准定时场景:
表格
| 调度类型 kind | 适用场景 | 配套参数 | 使用示例 |
|---|---|---|---|
| at | 一次性定点任务 | atMs(毫秒时间戳) | 30 分钟后执行单次提醒 |
| every | 固定间隔循环任务 | everyMs(间隔毫秒) | everyMs:43200000 = 每 12 小时执行一次 |
| cron | 标准分时区定时表达式 | expr、tz | 工作日早 9 点 55 分自动执行 |
标准 Cron 调度完整配置示例(解决时区时差报错)
json
"schedule": {
"kind": "cron",
"expr": "55 9 3 * *",
"tz": "Asia/Shanghai"
}
字段说明:
expr:5 段标准 Cron 表达式,顺序:分 时 日 月 周;tz:时区强制指定为 Asia/Shanghai,规避 Docker 容器默认 UTC 时区导致定时时间偏移数小时的高频坑。
4. 会话与唤醒执行配置
sessionTarget会话运行模式main:主会话执行,任务指令等同于手动发送消息,会污染主对话上下文;isolated:独立隔离会话,推荐复杂任务(脚本执行、报表生成、联网检索)使用,执行结束仅同步结果至主 Agent,不干扰原有对话;
wakeMode: "next-heartbeat":到触发时间后,等待下一轮调度心跳周期执行,存在毫秒级轻微延迟,降低进程高频轮询资源消耗。
5. payload 任务执行载荷
定义到达触发时间后,Agent 需要执行的具体指令:
kind: "agentTurn":核心常用类型,将 message 内文本作为用户消息投递给 Agent 自动执行;kind: "systemEvent":仅在仪表盘推送系统通知,不会触发 Agent 执行任何指令;
message:自定义执行指令文本,可调度脚本、调用工具、对话问答、浏览器自动化等全部 OpenClaw 内置能力。
6. state 自动更新运行状态(只读,无需手动编辑)
所有字段由调度器执行完成后自动回写,用于调度计算与日志排查:
nextRunAtMs:下一次任务触发毫秒时间戳;lastRunAtMs:上一次成功执行时间;lastStatus:上次运行结果状态,ok 代表执行正常;lastDurationMs:上次任务完整执行耗时,单位毫秒。
四、两种任务创建配置方式
方式 1:自然语言对话快速创建(日常简易使用)
直接在 OpenClaw 仪表盘对话窗口向 Agent 发送定时需求,框架自动解析生成任务并持久化写入 jobs.json,无需手动编辑配置文件。
示例话术:
- 每天上午 9 点 30 分,使用隔离会话执行脚本 check.sh;
- 每 6 小时自动检索一次数据并生成汇总报告;
- 2026 年 7 月 1 日 14 点一次性发送提醒消息。
方式 2:手动编辑 jobs.json(批量运维、批量导入场景)
适用于批量批量新增、批量修改定时任务场景,修改完成后重启 OpenClaw 网关即可加载新配置;Docker 部署修改需操作宿主机对应挂载目录内的文件,不可直接修改容器内文件。
五、运维避坑核心要点
- 容器时区问题:使用 cron 表达式必须配置
tz: "Asia/Shanghai",否则容器默认 UTC 时区,定时时间相差 8 小时; - 挂载卷持久化:Docker 部署务必绑定
.openclaw完整目录,否则容器删除 / 重建后全部定时任务丢失; - 网关停机漏执行:进程停止期间到达执行时间的任务不会自动补跑,重启后仅按规则计算下一轮触发时间;
- 会话模式选择:脚本、批量自动化任务统一使用
isolated隔离会话,避免主对话上下文堆积冗余内容; - 禁止手动修改 state 字段:运行状态、时间戳由程序自动维护,手动篡改会导致调度计算错乱,任务无法按时触发。
六、总结
OpenClaw 内置 Cron 是一套轻量化进程内调度系统,无外部组件依赖,依靠本地jobs.json文件持久化存储全部定时任务。Docker 部署场景可通过 docker inspect 命令快速定位宿主机配置文件路径,支持一次性定点、固定间隔、标准分时区 Cron 三种调度模式,搭配隔离会话机制适配脚本执行、自动化报表、周期性检索等各类业务场景。
相比外部定时服务,该方案集成度更高、开箱即用,但受进程生命周期限制,生产环境高频核心定时任务可搭配外部定时工具兜底,普通自动化任务依靠内置 Cron 即可完全满足落地需求。