Post

AI能力集 -- /loop 三天就废?如何设置长定时任务

Claude Code 里的 /loop、/goal、CronCreate、ScheduleWakeup 等"定时任务"机制对比,并考虑定时任务长期运行

AI能力集 -- /loop 三天就废?如何设置长定时任务

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,结构都一样:

  1. 一个任务指令文件(shell 脚本 / bat / plist)
  2. 一个触发器(系统定时)
  3. 一个调用 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) 在名字里老实告诉你”我会持久化”,反而是唯一靠谱的跨会话方案。

This post is licensed under CC BY 4.0 by the author.