Claude Code /loop 定时任务:固定间隔、动态调度与 loop.md 自定义
Claude Code 定时任务让 Claude 按间隔自动重跑提示词:轮询部署、守候 PR、检查长时间构建,或在会话内设置一次性提醒。/loop 是最快的用法,支持固定间隔(/loop 5m 检查部署)、Claude 动态选择间隔(/loop 检查构建)或运行内置维护提示词。你可以在 .claude/loop.md 中自定义默认提示词。需注意,任务是会话级的,关闭会话后消失;持久化调度应使用云端任务(Routines)或桌面定时任务。需要 Claude Code v2.1.72 或更高版本(claude --version 检查)。会话内最多 50 个任务,周期任务 7 天后自动过期。
/loop 和 cron 调度工具让 Claude 自动重跑提示词:轮询部署、守候 PR、检查长时间构建,或设置会话内提醒。如果希望在事件发生时即时响应而不是轮询,请参阅通道——你的 CI 可以直接将失败推送到会话中。如果需要保持会话(而非按固定间隔)持续工作直至条件满足,请参阅 /goal。
需要 Claude Code v2.1.72 或更高版本。用
claude --version检查版本。
任务是会话级的,存在于当前对话中,新会话启动后消失。--resume 或 --continue 恢复时会带回未过期的任务:7 天内创建的周期性任务,或预定触发时间未过的一次性任务。需要独立于任何会话持久化运行的调度,请使用云端任务 (Routines)、桌面定时任务或 GitHub Actions。
三种调度方式对比
Claude Code 提供三种方式安排周期性或一次性工作:
| 云端任务 | 桌面任务 | /loop |
|
|---|---|---|---|
| 运行于 | Anthropic 云 | 你的机器 | 你的机器 |
| 需要机器开启 | 否 | 是 | 是 |
| 需要打开会话 | 否 | 否 | 是 |
| 跨重启持久化 | 是 | 是 | 通过 --resume 恢复,未过期才恢复 |
| 访问本地文件 | 否(全新克隆) | 是 | 是 |
| MCP 服务器 | 每个任务独立配置连接器 | 配置文件和连接器 | 继承会话 |
| 权限提示 | 无(自主运行) | 每个任务可配置 | 继承会话 |
| 可自定义调度 | 通过 CLI 的 /schedule 命令 |
是 | 是 |
| 最小间隔 | 1 小时 | 1 分钟 | 1 分钟 |
选择建议:需要不依赖本机可靠运行时用云端任务;需要访问本地文件和工具时用桌面任务;会话内快速轮询时用
/loop。
使用 /loop 运行周期性提示词
/loop 内置 skill 是会话保持期间最快重复运行提示词的方式。是否提供间隔和提示词决定了循环行为:
| 提供内容 | 示例 | 行为 |
|---|---|---|
| 间隔和提示词 | /loop 5m 检查部署 |
按固定间隔运行 |
| 仅提示词 | /loop 检查部署 |
每次迭代由 Claude 动态选择间隔 |
| 仅间隔或不提供 | /loop |
运行内置维护提示词,或存在 loop.md 时使用其内容 |
你也可以将另一条命令作为提示词,例如 /loop 20m /review-pr 1234,每次迭代时重跑打包好的工作流。
在固定间隔运行
提供间隔时,Claude 将其转换为 cron 表达式,调度任务,并确认执行频率和任务 ID。
/loop 5m 检查部署是否完成并告诉我发生了什么
间隔可以放在提示词前面(如 30m),也可以作为尾部子句(如 every 2 hours)。支持的时间单位:s(秒)、m(分钟)、h(小时)、d(天)。
秒会向上取整到分钟(cron 精度为分钟)。7m 或 90m 这种不能整除的间隔会取整到最近的可用值,Claude 会告诉你实际选择了什么。
让 Claude 动态选择间隔
省略间隔时,Claude 不执行固定 cron 调度,而是在每次迭代后动态决定等待时间。等待范围从 1 分钟到 1 小时:构建进行中或 PR 活跃时等待更短,无事时等待更长。每次迭代结束时都会打印所选间隔和原因。
以下示例检查 CI 和 review 评论,PR 静下来后,Claude 会延长等待时间:
/loop 检查 CI 是否通过并处理所有 review 评论
当你请求动态 /loop 时,Claude 可能直接使用 Monitor 工具。Monitor 在后台运行脚本并实时流式传输每行输出,完全避免轮询,通常比定期重跑提示词更省 token、响应更及时。
动态调度的循环也会出现在定时任务列表中,和其他任务一样可以列出或取消。抖动规则不适用于动态循环,但7 天过期适用:循环在启动后 7 天自动结束。
在 Bedrock、Vertex AI 和 Microsoft Foundry 上,不加间隔的提示词以固定 10 分钟间隔运行。
运行内置维护提示词
省略提示词时,Claude 使用内置维护提示词。每次迭代依次处理:
- 继续对话中未完成的工作
- 处理当前分支的 PR:review 评论、CI 失败、merge 冲突
- 无待办事项时执行代码清理(bug 搜寻、简化等)
Claude 不会启动此范围之外的新工作。不可逆操作(如 push 或删除)仅在对话已授权时继续。
/loop
不带参数的 /loop 以动态选择的间隔运行。加上间隔(如 /loop 15m)可改为固定调度。要替换内置提示词,请参阅用 loop.md 自定义默认提示词。
在 Bedrock、Vertex AI 和 Microsoft Foundry 上,不带提示词的
/loop打印用法消息,不运行维护提示词。
用 loop.md 自定义默认提示词
loop.md 文件用你自己的指令替换内置维护提示词,定义了不带提示词时 /loop 的默认操作。当你提供提示词时它被忽略。要配合它调度其他提示词,可使用 /loop <prompt> 或直接询问 Claude。
Claude Code 按以下顺序查找并优先使用第一个找到的文件:
| 路径 | 作用范围 |
|---|---|
.claude/loop.md |
项目级。两个文件都存在时优先。 |
~/.claude/loop.md |
用户级。在没有项目级文件的任何项目中生效。 |
文件是纯 Markdown,无固定结构要求。像直接输入 /loop 提示词那样写即可。以下示例维护一个 release 分支:
检查 `release/next` PR。CI 红灯时,拉取失败任务日志,诊断问题,推送最小修复。
有新 review 评论时逐一处理并解决线程。一切正常且安静时用一行说明。
循环运行中对 loop.md 的修改在下次迭代时生效。文件内容超过 25,000 字节的部分会被截断。两个位置都不存在 loop.md 时,回退到内置维护提示词。
在 Bedrock、Vertex AI 和 Microsoft Foundry 上,
loop.md不会被读取,不带提示词的/loop打印用法消息。
停止循环
在 /loop 等待下一次迭代时,按 Esc 键清除待触发的唤醒,循环不会再次触发。通过直接询问 Claude 调度的任务不受 Esc 影响,会保留直到被删除。
在自调速模式下,Claude 在任务明显完成时也可以自行不再调度下一个唤醒来结束循环。固定间隔的循环会一直运行,直到你停止它或7 天过期。
设置一次性提醒
对于一次性提醒,用自然语言描述,而不是使用 /loop。Claude 会安排一个触发后自动删除的任务。
下午 3 点提醒我推送发布分支
45 分钟后检查集成测试是否通过
Claude 将触发时间固定到特定分钟和小时,并确认执行时间。
管理定时任务
用自然语言让 Claude 列出或取消任务,或直接引用底层工具。
我有哪些定时任务?
取消 deploy-check 任务
底层使用以下工具:
| 工具 | 用途 |
|---|---|
CronCreate |
创建新任务。接受 5 字段 cron 表达式、提示词、是否重复。 |
CronList |
列出所有定时任务(ID、调度、提示词)。 |
CronDelete |
按 ID 取消任务。 |
每个任务有一个 8 字符的 ID,可传给 CronDelete。一个会话最多可同时容纳 50 个定时任务。
定时任务的执行机制
调度器每秒检查到期任务,以低优先级入队。定时提示词在两次会话轮次之间触发,不会在 Claude 响应过程中中断。如果 Claude 正忙,提示词等到当前轮次结束后执行。
所有时间以本地时区解释。0 9 * * * 表示运行 Claude Code 所在时区的早上 9 点,不是 UTC。
抖动
为避免所有会话在同一时刻触发 API,调度器为触发时间增加一个确定性偏移:
- 周期性任务触发延迟最多为预定时间后 30 分钟(或间隔的一半,对于每小时运行超快的任务)。每小时任务预定
:00可能最迟在:30触发。 - 一次性任务如果预定在整点或半点,可能提前最多 90 秒触发。
偏移量由任务 ID 决定,同一任务每次偏移相同。如果对触发时间有精确要求,选择不是 :00 或 :30 的分钟,例如用 3 9 * * * 代替 0 9 * * *,一次性任务的抖动就不会生效。
7 天过期
周期性任务在创建后 7 天自动过期。任务触发最后一次后删除自身。这限制了遗忘循环可以运行的时间。如果需要更长的周期性任务,在过期前取消并重新创建,或使用云端任务 (Routines) 或桌面定时任务做持久化调度。
Cron 表达式参考
CronCreate 接受标准 5 字段 cron 表达式:minute hour day-of-month month day-of-week。所有字段支持通配符(*)、单值(5)、步进(*/15)、范围(1-5)、逗号列表(1,15,30)。
| 示例 | 含义 |
|---|---|
*/5 * * * * |
每 5 分钟 |
0 * * * * |
每小时整点 |
7 * * * * |
每小时第 7 分钟 |
0 9 * * * |
每天本地时间 9:00 |
0 9 * * 1-5 |
工作日 9:00 |
30 14 15 3 * |
3 月 15 日 14:30 |
星期中,0 或 7 表示星期日,6 表示星期六。不支持 L、W、? 等扩展语法或名称别名(如 MON、JAN)。
当日和星期都受约束时,只要其中一个匹配就算匹配。这遵循标准 vixie-cron 语义。
禁用定时任务
在环境中设置 CLAUDE_CODE_DISABLE_CRON=1 禁用调度器。cron 工具和 /loop 变得不可用,已调度的任务停止触发。请参阅环境变量查看完整的禁用标志列表。
限制
会话级调度具有以下固有限制:
- 任务仅在 Claude Code 运行且空闲时触发。关闭终端或退出会话会停止触发。
- 不补跑错过触发。如果任务到期时 Claude 正忙(长时间请求),Claude 空闲后只会触发一次,不会为每个错过的时间段触发一次。
- 开始新对话会清除所有会话级任务。用
claude --resume或claude --continue恢复时会带回未过期的任务:7 天内的周期性任务,和预定触发时间未过的一次性任务。后台 Bash 任务和 monitor 任务不会在恢复时恢复。
对于需要无人值守运行的 cron 自动化:
- 云端任务 (Routines):在 Anthropic 管理的基础设施上按调度、API 调用或 GitHub 事件运行
- GitHub Actions:在 CI 中使用
schedule触发器 - 桌面定时任务: 在本地机器上运行
常见问题
/loop 和云端任务(Routines)有什么区别?
/loop 是会话内的轻量级轮询,随会话关闭而消失,适合快速检查。云端任务在 Anthropic 基础设施上独立运行,无需你的机器开机,适合持久化调度。桌面任务则在你的机器上运行,可以访问本地文件。
为什么我的 /loop 任务只运行了一次就没了?
可能原因:1)任务在 7 天后自动过期;2)你启动了新会话(会话级任务被清除);3)你按了 Esc 键清除了待触发的唤醒;4)CLAUDE_CODE_DISABLE_CRON=1 环境变量被设置。检查方式:claude --version 确保版本 ≥ 2.1.72,并确认无禁用环境变量。
动态间隔的 /loop 怎么不按固定时间跑?
动态间隔下,Claude 每次迭代后根据观察到的状态决定等待时间——活跃时等待短,无事时等待长。这是设计行为,不是 bug。每次迭代结束时 Claudio 会打印所选间隔和原因。如果你需要准时触发,请使用固定间隔,如 /loop 15m 检查构建。