资讯动态

Codex Scheduled Tasks 实战:用 RRULE 让任务自动醒来继续工作

发布时间:2026/10/3 12:01:55 来源:尧图企业网站定制
1. Codex Scheduled Tasks 定时续跑到底解决什么问题Codex Scheduled Tasks 是 Codex 里用来让任务按计划自动醒来的能力你可以把它理解成给一个已经跑通的工作流装上闹钟到点自动执行执行完把结果写回指定位置下一次到点再继续。它最适合三类人一是手里有长期研究或分阶段实现任务、不想每天手动催一次的开发者二是需要定期检查依赖、文档、测试回归的维护者三是想把重复性报告交给机器、自己只看结论的团队负责人。核心检索词就是 Codex Scheduled Tasks 定时续跑而让它真正可控的关键是 RRULE 表达式加 Worktree 隔离。我试过把一个跨三天的资料整理任务拆成定时续跑最大的感受是定时本身不难难的是第十次运行时它还记得自己做到哪、输入变了没有、旧结论还能不能用。所以这篇不讲“怎么点按钮”而是给你一套可复制的 RRULE 配置、Worktree 目录结构以及一次定时触发后的续跑验证步骤。你照着做能让中断的任务按计划自动恢复而不是每次从零重来。先说清楚边界Scheduled Tasks 的管理入口在 ChatGPT Web 或桌面应用不在 Codex CLI/IDE 里。本地项目任务要求电脑开机、应用运行、目录可访问。功能是否启用、可选模型、计划粒度可能受套餐和工作区影响。文中提到的补跑、锁、重试属于运行手册层面的设计不代表产品原生保证这点后面会反复强调。为什么强调 RRULE因为自然语言写“每天早上”在不同时区、不同夏令时切换下会漂移而 RRULE 是 RFC 5545 标准表达能被稳定解析。比如每月 1 日 09:00 可以写成RRULE:FREQMONTHLY;BYMONTHDAY1;BYHOUR9;BYMINUTE0。你要做长期续跑就必须让“什么时候醒”这件事没有歧义。再叠加 Worktree。定时任务如果直接改主工作区很容易和你正在写的代码打架。Worktree 给每次运行一个隔离的 Git 工作树任务在里面生成候选修改你事后比较、挑选、合并。这样多个定时任务可以并行互不覆盖文件。下面从环境准备开始一步步落地。2. TaoToken 前置把模型调用和 Key 准备好在配置 Scheduled Tasks 之前得先保证任务运行时能稳定调用模型。这里用 TaoToken 作为统一入口它的 API 地址是https://taotoken.net/api官网是https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content。你需要先拿到 API Key再把它写进任务运行环境而不是硬编码在提示词里。拿 Key 的路径很直接打开控制台进入 API Keys 页面创建。控制台地址是https://taotoken.net/consoleAPI Keys 页面是https://taotoken.net/api-keys。创建后复制那串以sk-开头的密钥只显示一次务必存到受控的密钥管理里。如果你还想先验证模型是否通可以用模型对话页面https://taotoken.net/model-chat发一条测试消息确认返回正常再往下走。对于长期编码或 Agent 类任务建议看 Coding Plan 页面https://taotoken.net/coding-plan它更适合高频、长时间的续跑场景。接入文档在https://taotoken.net/doc里面有 Base URL、鉴权和各语言示例。Claude Code 相关接入可以看https://taotoken.net/claude-code-anthropic。关键点Scheduled Tasks 每次醒来都要重新建立模型连接所以 Key 必须放在环境变量或受控配置里不能写进会被反复读取的提示词正文。推荐用环境变量TAOTOKEN_API_KEYBase URL 固定为https://taotoken.net/api。下面给一份可复制的配置片段路径和字段名按你实际项目调整。{ provider: taotoken, base_url: https://taotoken.net/api, api_key_env: TAOTOKEN_API_KEY, model_id: claude-sonnet-4-5, timeout_seconds: 120, max_retries: 1 }如果你用的是 Codex 的auth.json风格配置可以写成下面这样注意 Base URL、Key、Model ID 三件套齐全缺一个都会在运行时报鉴权或模型不存在错误。{ auths: { taotoken: { base_url: https://taotoken.net/api, api_key: ${TAOTOKEN_API_KEY}, model: claude-sonnet-4-5 } } }写完后先手动跑一次最小请求确认 Key 生效。命令示例export TAOTOKEN_API_KEYsk-你的密钥 curl -s https://taotoken.net/api/v1/models \ -H Authorization: Bearer $TAOTOKEN_API_KEY | head -c 400返回模型列表就说明前置通了。这一步别省因为定时任务失败时你很难判断是调度问题还是 Key 问题先把变量排除掉。3. 可复制配置RRULE 表达式与 Worktree 目录结构这一节是全文最该抄走的部分。先讲 RRULE再讲 Worktree 目录最后给一份完整的任务配置片段。RRULE 的字段含义FREQ是频率DAILY/WEEKLY/MONTHLYBYHOUR/BYMINUTE是触发时刻BYDAY是星期INTERVAL是间隔。几个常用例子# 每天 09:00 RRULE:FREQDAILY;BYHOUR9;BYMINUTE0 # 每周一、周四 10:30 RRULE:FREQWEEKLY;BYDAYMO,TH;BYHOUR10;BYMINUTE30 # 每 2 小时一次用于短周期续跑 RRULE:FREQHOURLY;INTERVAL2;BYMINUTE0 # 每月 1 日 09:00 RRULE:FREQMONTHLY;BYMONTHDAY1;BYHOUR9;BYMINUTE0时区必须单独设置比如Asia/Singapore。不要只写“早上”跨国团队对早上的理解不一样。夏令时切换时RRULE 按本地时区解析所以时区字段比 RRULE 本身还重要。接下来是 Worktree 目录结构。假设主仓库在~/projects/myapp给定时任务单独开一个工作树根目录~/projects/myapp/ # 主工作区人工开发用 ~/codex-worktrees/ # 定时任务工作树根目录 ├── task-doc-tracker/ # 任务一文档变化追踪 │ ├── .git # 指向主仓库的 worktree 元数据 │ ├── state/ │ │ ├── last_success.json # 上次成功水位 │ │ └── run.lock # 单实例锁 │ └── reports/ │ └── 2025-06-01.md └── task-dep-audit/ # 任务二依赖审计 ├── .git ├── state/ └── reports/创建 Worktree 的命令cd ~/projects/myapp git worktree add ~/codex-worktrees/task-doc-tracker -b codex/doc-tracker这样任务在task-doc-tracker里读写不会碰主工作区。任务结束后你进这个目录看 diff决定是否合并。完整任务配置片段把 RRULE、时区、Worktree、上下文模式、无变化策略都写进去{ task_name: doc-tracker, schedule: { rrule: RRULE:FREQWEEKLY;BYDAYMO;BYHOUR9;BYMINUTE0, timezone: Asia/Singapore }, context_mode: resume, workdir: ~/codex-worktrees/task-doc-tracker, isolation: worktree, state_file: state/last_success.json, lock_file: state/run.lock, no_change_policy: silent_summary, max_retries: 1, on_failure: stop_and_report, model: { base_url: https://taotoken.net/api, api_key_env: TAOTOKEN_API_KEY, model_id: claude-sonnet-4-5 } }context_mode选resume表示回到原任务续跑选new表示每次独立运行。判断标准很简单删掉上次对话后任务还能完整执行就用new必须理解上次为什么选 A 拒绝 B才用resume。no_change_policy设成silent_summary无变化时只回一行避免每天制造没人看的长报告。4. 验证请求一次定时触发后的续跑结果配置写完不能直接信要手动触发一次看它是否真的按计划醒来并续跑。验证分三步先手动跑通再模拟定时触发最后检查状态文件。第一步手动执行任务提示确认正常路径。在 Worktree 目录里跑一次cd ~/codex-worktrees/task-doc-tracker cat state/last_success.json如果状态文件不存在说明是首次运行任务应该走全量初始化。跑完后检查reports/下是否生成了带时间戳的报告以及last_success.json是否更新了水位。第二步模拟定时触发。把 RRULE 临时改成FREQMINUTELY;INTERVAL1等一分钟看是否自动运行。观察侧栏 Scheduled 里的状态、下次运行时间、目标项目。触发后检查ls -lt reports/ | head -5 cat state/last_success.json成功的结果应该长这样报告文件时间戳是刚刚last_success.json里的last_run更新为本次时间window_start等于上次的last_run。这就证明续跑窗口正确衔接没有重复处理旧数据。第三步验证无变化路径。连续触发两次第二次应该只输出一行摘要比如“检查范围 X时间 Y无可行动变化”而不是又生成一份长报告。如果第二次仍然全量输出说明no_change_policy没生效回去检查状态文件是否被正确读取。第四步验证锁。任务运行期间再触发一次第二次应该检测到run.lock存在而跳过而不是并行跑两个实例。你可以手动创建锁文件测试touch state/run.lock # 触发任务应看到 skipped: lock held rm state/run.lock实测下来这四步走完你基本能确认续跑逻辑是通的。任何一步不符合预期先别扩大频率回到配置里逐项核对。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth定时任务报错和手动跑不一样因为你看不到实时输出只能靠日志和状态文件。下面按真实报错对照排查。401 UnauthorizedKey 没生效或环境变量没传进任务进程。检查TAOTOKEN_API_KEY是否在任务运行环境里可见Base URL 是否是https://taotoken.net/api。注意定时任务可能用独立 shell你终端里 export 的变量它读不到要写进任务配置或系统级环境。local proxy failed本地代理或网络层拦截了请求。检查是否有本地端口占用、防火墙规则、或代理配置指向了不可用地址。把 Base URL 直连https://taotoken.net/api测试排除中间层。reading choices 相关报错通常是响应体解析失败模型返回了非预期结构。检查model_id是否拼写正确、是否在当前套餐可用。用模型对话页面https://taotoken.net/model-chat发同样请求对比返回结构。OAuth 相关报错如果你用的是需要 OAuth 的接入方式token 过期会导致定时任务静默失败。检查凭据刷新机制确保每次运行前 token 有效。长期任务建议用 API Key 而非交互式 OAuth。任务根本没触发先看侧栏 Scheduled 里的下次运行时间是否正确时区是否写错。本地任务还要求电脑开机、应用运行、目录可访问设备休眠期间不会执行。重复处理状态文件没更新或幂等键缺失。检查last_success.json是否在成功后原子写入外部副作用是否有唯一键。Worktree 冲突多个任务改了同一文件集合。给每个任务独立 Worktree禁止自动合并人工挑选。排查顺序建议先确认 Key 和 Base URL再看调度和时区最后看状态和幂等。大部分“任务没续跑”其实是 Key 或时区问题不是调度本身。6. 语义一致 CTA把定时续跑接到你的工作流走到这里你已经有了 RRULE 配置、Worktree 隔离、状态文件和验证步骤。接下来就是把它接到真实工作流里。如果你还在排障或接入阶段先去 API Keys 页面https://taotoken.net/api-keys确认密钥再看接入文档https://taotoken.net/doc对齐 Base URL 和鉴权格式。想先验证模型是否通用模型对话https://taotoken.net/model-chat发一条测试消息最直接。如果你的定时任务是长期编码或 Agent 续跑建议看 Coding Planhttps://taotoken.net/coding-plan它更适合高频、长时间的自动运行。Claude Code 相关接入在https://taotoken.net/claude-code-anthropic控制台在https://taotoken.net/console。最后给一个实用技巧从一个低风险、只读、无变化可静默的任务开始手动跑通异常路径再设频率。前几次运行安排人工复核确认输入范围、无变化回执、运行环境和停止条件都对再决定是否延长周期或扩大权限。退役和创建一样重要目标完成或报告连续无人使用时停止调度、归档状态、撤销权限、清理 Worktree。只把任务改名“暂不用”却留着权限会留下无人负责的自动化资产。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑