绝大多数 OpenClaw 使用教程只简单提一句「支持自然语言创建定时任务」,完全不讲解底层调度运行逻辑、持久化文件存储规则,Docker 部署用户经常找不到定时任务配置文件、定时触发时间错乱、容器重启任务丢失等问题无从排查。

本文从底层实现逻辑切入,完整拆解 OpenClaw 进程内置 Cron 调度器运行机制,重点覆盖 Docker 容器场景下 jobs.json 文件宿主机路径定位全套排查命令,逐条解析任务配置文件全部字段含义,区分一次性定时、固定间隔、标准 Cron 表达式三种调度模式,同时说明会话隔离、时区校准、任务执行载体等容易踩坑的细节,所有查询、定位、配置方式均可直接复制落地。

一、OpenClaw 内置 Cron 调度底层实现原理

OpenClaw 并未依赖第三方定时调度中间件,所有定时逻辑全部内置在网关进程内部,属于进程内存级轻量调度方案,完整运行链路如下:

  1. 内存调度器常驻:网关启动时自动加载cron/jobs.json内全部任务至内存,生成独立调度管理模块;
  2. 周期时间推演:调度器持续轮询,根据任务配置的调度规则(间隔 / 标准 Cron / 一次性定点)实时计算每一条任务的下一次执行时间戳;
  3. 到达触发投递:系统时间匹配nextRunAtMs毫秒时间戳后,将完整任务载荷投递至内部执行队列;
  4. 线程池异步执行:由进程内置线程池 / 协程队列接收任务,按照配置的会话模式调用对应 Agent 执行指令;
  5. 状态持久化回写:任务执行完毕后,自动更新state字段内上次运行时间、运行状态、执行耗时、下次触发时间,同步写入本地 jobs.json 持久化保存,容器重启不会丢失任务。

核心优势:无需额外部署 Crond、XXL-Job 等外部定时组件,开箱即用;短板为进程级调度,网关完全停止运行期间会跳过到期任务,重启后自动按规则重新计算下一轮执行时间。

二、Cron 任务持久化存储规则(Docker 部署重点)

1. 文件固定路径逻辑

OpenClaw 定时任务数据统一存放于程序数据根目录下固定相对路径,后半段路径为代码硬编码,不可自定义修改:

固定后缀路径:cron/jobs.json

完整拼接规则:程序数据根目录 + cron/jobs.json

程序默认数据根目录读取优先级:

  1. 读取系统环境变量$HOME,默认存放.openclaw文件夹;
  2. 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}}'
关键字段解读
  1. 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
  1. 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"
}

字段说明:

  1. expr:5 段标准 Cron 表达式,顺序:分 时 日 月 周;
  2. tz:时区强制指定为 Asia/Shanghai,规避 Docker 容器默认 UTC 时区导致定时时间偏移数小时的高频坑。

4. 会话与唤醒执行配置

  • sessionTarget 会话运行模式
    1. main:主会话执行,任务指令等同于手动发送消息,会污染主对话上下文;
    2. isolated:独立隔离会话,推荐复杂任务(脚本执行、报表生成、联网检索)使用,执行结束仅同步结果至主 Agent,不干扰原有对话;
  • wakeMode: "next-heartbeat":到触发时间后,等待下一轮调度心跳周期执行,存在毫秒级轻微延迟,降低进程高频轮询资源消耗。

5. payload 任务执行载荷

定义到达触发时间后,Agent 需要执行的具体指令:

  1. kind: "agentTurn":核心常用类型,将 message 内文本作为用户消息投递给 Agent 自动执行;
  2. kind: "systemEvent":仅在仪表盘推送系统通知,不会触发 Agent 执行任何指令;
  • message:自定义执行指令文本,可调度脚本、调用工具、对话问答、浏览器自动化等全部 OpenClaw 内置能力。

6. state 自动更新运行状态(只读,无需手动编辑)

所有字段由调度器执行完成后自动回写,用于调度计算与日志排查:

  • nextRunAtMs:下一次任务触发毫秒时间戳;
  • lastRunAtMs:上一次成功执行时间;
  • lastStatus:上次运行结果状态,ok 代表执行正常;
  • lastDurationMs:上次任务完整执行耗时,单位毫秒。

四、两种任务创建配置方式

方式 1:自然语言对话快速创建(日常简易使用)

直接在 OpenClaw 仪表盘对话窗口向 Agent 发送定时需求,框架自动解析生成任务并持久化写入 jobs.json,无需手动编辑配置文件。

示例话术:

  1. 每天上午 9 点 30 分,使用隔离会话执行脚本 check.sh;
  2. 每 6 小时自动检索一次数据并生成汇总报告;
  3. 2026 年 7 月 1 日 14 点一次性发送提醒消息。

方式 2:手动编辑 jobs.json(批量运维、批量导入场景)

适用于批量批量新增、批量修改定时任务场景,修改完成后重启 OpenClaw 网关即可加载新配置;Docker 部署修改需操作宿主机对应挂载目录内的文件,不可直接修改容器内文件。

五、运维避坑核心要点

  1. 容器时区问题:使用 cron 表达式必须配置tz: "Asia/Shanghai",否则容器默认 UTC 时区,定时时间相差 8 小时;
  2. 挂载卷持久化:Docker 部署务必绑定.openclaw完整目录,否则容器删除 / 重建后全部定时任务丢失;
  3. 网关停机漏执行:进程停止期间到达执行时间的任务不会自动补跑,重启后仅按规则计算下一轮触发时间;
  4. 会话模式选择:脚本、批量自动化任务统一使用isolated隔离会话,避免主对话上下文堆积冗余内容;
  5. 禁止手动修改 state 字段:运行状态、时间戳由程序自动维护,手动篡改会导致调度计算错乱,任务无法按时触发。

六、总结

OpenClaw 内置 Cron 是一套轻量化进程内调度系统,无外部组件依赖,依靠本地jobs.json文件持久化存储全部定时任务。Docker 部署场景可通过 docker inspect 命令快速定位宿主机配置文件路径,支持一次性定点、固定间隔、标准分时区 Cron 三种调度模式,搭配隔离会话机制适配脚本执行、自动化报表、周期性检索等各类业务场景。

相比外部定时服务,该方案集成度更高、开箱即用,但受进程生命周期限制,生产环境高频核心定时任务可搭配外部定时工具兜底,普通自动化任务依靠内置 Cron 即可完全满足落地需求。