AI能力集 -- /loop 三天就废?如何设置长定时任务
Claude Code 里的 /loop、/goal、CronCreate、ScheduleWakeup 等"定时任务"机制对比,并考虑定时任务长期运行
1. 引言
/loop 这个东西挺好用,日常用 Claude Code 这种本地 Agent,我经常用 /loop 搞个每日数据统计、日志巡检之类的活。
但有个坑第一次用就踩到了:/loop 创建的定时任务,固定 72 小时自动销毁,到了时间点直接消失,任务就消失了。
这文章就把跟”定时任务”沾边的几个机制拆开,讲清楚哪些是假动作、哪些真能用。
2. 几种”续命”方式分析
2.1. 单 Loop 单独跑
这种方式显然不可行,3天到点就失效。
2.2. 双 Loop 互相续期
调研时看到一种”聪明”的办法:A 是业务 loop,B 是定时去重建 A 的 loop。
听起来挺好?但 B 它本身也是个 loop,也是 72 小时寿命。B 一死,A 没人续,整套还是断。这只是把”3 天断”延长到了”6 天断”,本质问题没解决。
2.3. 三 Loop 环形互保
又看到一个更花哨的:三个 loop 互相重建,故意把创建时间错开,降低同时过期的概率。
听着挺美,实操下来问题不少:Daemon 重启、网络抽风、某次执行失败,这几个时间轴就慢慢对齐了,然后三个一起失效。这种”概率续命”压根不能上生产。
2.4. 频繁互动保活
这招最朴素,也没用。会话活不活跃,跟 loop 任务的生命周期一点关系都没有。
2.5. Goal 续 Loop —— 听起来聪明,实际是假象
我之前在第一版博客里,把这个当成”个人临时用”方案推荐过。后来真正去调研 Goal 的实现才发现 大错特错:
/goal的本质是会话内的”持续目标”,跟 Loop 一样,会话一关就死- 让 Goal 去”续 Loop”?Goal 本身就没了,谁来续?
- 关闭会话 → Goal 立刻失效;重开新会话 → Goal 不会恢复
所以”Goal 续 Loop”只是把 Loop 的寿命延长到 Goal 跟会话共存亡那一刻,跟 Loop 本身一样脆弱,完全不能当”长期方案”用。
更详细的行为拆解,放到第 4 节跟其他机制一起讲。
3. 各种机制的真实行为
这一节是核心。我把所有跟”定时”沾边的机制都列出来,按几个维度逐一拆开。
3.1. 一张速查表
| 机制 | 会话一直开着 | 关闭会话 | 重开新会话 | 多久自动过期 | 适合”每天做”吗 |
|---|---|---|---|---|---|
/goal | ✅ 持续生效 | ❌ 立刻失效 | ❌ 不会恢复 | 无显式过期,跟随会话生命周期 | ❌ |
CronCreate (durable: false) | ✅ 持续生效 | ❌ 立刻失效 | ❌ 不会恢复 | 周期性任务 7 天(但前提是会话要活着) | ❌ |
CronCreate (durable: true) | ✅ 持续生效 | ✅ 持久化在 .claude/scheduled_tasks.json | ✅ 自动恢复,遗漏的 one-shot 会被”补跑” | 周期性任务 7 天(到点自动删除最后一次执行后) | ✅ 唯一靠谱选择 |
/loop (固定间隔,如 /loop 5m /foo) | ✅ 持续生效 | ❌ 立刻失效 | ❌ 不会恢复 | 文档未明确 7 天上限,会话一旦结束就死 | ❌ |
/loop (无间隔动态模式) | ✅ 持续生效 | ❌ 立刻失效 | ❌ 不会恢复 | 同上 | ❌ |
ScheduleWakeup(/loop 内部用的) | ✅ 单次唤醒 | ❌ 唤醒请求随进程消失 | ❌ 不会恢复 | 不适用(单次) | ❌ |
一眼能看出的结论:跨会话能用的,只有 CronCreate (durable: true) 一个。其他都是”会话死就死”。
3.2. /goal:会话内的”持续目标”,不是定时器
/goal 的本质是给 Agent 一个长期目标,让 Agent 持续往这个方向努力。它不是定时器。
真实行为:
- ✅ 会话一直开着 → 持续生效
- ❌ 关闭会话 → 立刻失效,Goal 跟会话同生死
- ❌ 重开新会话 → 不会恢复
- 没有显式过期时间,生命周期完全绑在会话上
所以:/goal 根本不能用来”续 Loop”。它跟 Loop 一样,会话一关就死。让 Goal 去续 Loop,只是把 Loop 的命运绑在 Goal 的命运上,绑了两层还是会一起死。
3.3. CronCreate (durable: false):默认的会话内定时
CronCreate 是 Claude Code 提供的定时任务工具,默认 durable: false。
真实行为:
- ✅ 会话一直开着 → 持续生效
- ❌ 关闭会话 → 立刻失效,任务当场蒸发
- ❌ 重开新会话 → 不会恢复
- 周期性任务有 7 天过期(但前提是会话要活着,实际根本撑不到 7 天)
关键细节:”7 天过期”不是”每 7 天重置”,是”会话内最多活 7 天”。一旦关闭 Claude Code,任务当场蒸发,根本撑不到第 7 天。
3.4. CronCreate (durable: true):真正跨会话的方案
这是唯一真能跨会话存活的方案。durable: true 之后,任务会持久化到 .claude/scheduled_tasks.json。
真实行为:
- ✅ 会话一直开着 → 持续生效
- ✅ 关闭会话 → 任务还在文件里,不受影响
- ✅ 重开新会话 → 自动恢复,遗漏的 one-shot 会被”补跑”(见下)
- 周期性任务有 7 天硬限制(到点自动删除最后一次执行后)
- 一次性任务(
recurring: false)没有 7 天限制
4. 操作系统外置定时(唯一能”永远跑”的方案)
这条路是彻底不依赖 Agent 引擎的调度机制,把定时这事交给操作系统。
4.1. 核心思路
- 操作系统(Windows 任务计划 / Linux cron / macOS launchd):系统级的东西,没 TTL 概念,可以开机自启、崩了自愈
- Claude Code 退化成”执行工具”,不负责调度,只负责干活
4.2. 跨平台落地
不管是 Windows、Linux 还是 macOS,结构都一样:
- 一个任务指令文件(shell 脚本 / bat / plist)
- 一个触发器(系统定时)
- 一个调用 Claude Code CLI 的命令
下面以 Windows 为例(最常见的踩坑场景):
1、第 1 步:写包装脚本。可选:批处理脚本(最简单)、PowerShell 脚本(更现代、可控性更强)
2、第 2 步:注册为系统定时任务。可选:PowerShell 注册(推荐,幂等可重跑)、GUI 点点点(最直观,调试方便)
1
2
3
4
5
6
7
8
9
10
11
1. Win + R → 输入 taskschd.msc → 回车
2. 右侧 "创建基本任务"
3. 名称:Claude Daily Task → 下一步
4. 触发器:每天 → 下一步
5. 时间:填 09:07:00 → 下一步
6. 操作:启动程序 → 下一步
7. 程序:C:\scripts\claude-daily-task.bat → 下一步 → 完成
8. 关键:回到列表里双击新建的任务 → 勾选
- ☑ "如果任务失败,按以下频率重新启动"
- ☑ "如果计算机错过计划就尽快运行"
- "使用最高权限运行"
3、第 3 步:调试 & 验证
4.3. bat 脚本示例
1
2
3
4
5
6
7
8
9
10
@echo off
chcp 65001
:: 替换为你的真实会话ID
set SESSION_ID=xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx
:: 任务指令文件路径
set TASK_TXT=D:\codebuddy_task\task.txt
:: 日志路径
set LOG=D:\codebuddy_task\run_log.txt
codebuddy -r %SESSION_ID% -p -y @%TASK_TXT% >> %LOG% 2>&1
5. 怎么选
调研完所有机制,我现在的选法基本就是看场景:
| 场景 | 推荐方案 |
|---|---|
| 临时测试、任务活不过 7 天 | CronCreate(durable: true),接受 7 天到期 |
| 7 天以上的长期业务 | 操作系统外置定时,别指望 Agent 内部机制 |
| 关掉 Claude Code 也要能跑 | CronCreate(durable: true) 或外置定时 |
| “永远跑”不自动过期 | 只有外置定时能做到,别无他法 |
调研下来最大的收获是:不要被”机制名”骗了。/goal 听起来像”长期目标”,但它跟会话同生死;/loop 听起来像”定时器”,但它只是 REPL 内部循环;只有 CronCreate(durable: true) 在名字里老实告诉你”我会持久化”,反而是唯一靠谱的跨会话方案。