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 精度为分钟)。7m90m 这种不能整除的间隔会取整到最近的可用值,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

星期中,07 表示星期日,6 表示星期六。不支持 LW? 等扩展语法或名称别名(如 MONJAN)。

当日和星期都受约束时,只要其中一个匹配就算匹配。这遵循标准 vixie-cron 语义。

禁用定时任务

在环境中设置 CLAUDE_CODE_DISABLE_CRON=1 禁用调度器。cron 工具和 /loop 变得不可用,已调度的任务停止触发。请参阅环境变量查看完整的禁用标志列表。

限制

会话级调度具有以下固有限制:

  • 任务仅在 Claude Code 运行且空闲时触发。关闭终端或退出会话会停止触发。
  • 不补跑错过触发。如果任务到期时 Claude 正忙(长时间请求),Claude 空闲后只会触发一次,不会为每个错过的时间段触发一次。
  • 开始新对话会清除所有会话级任务。用 claude --resumeclaude --continue 恢复时会带回未过期的任务:7 天内的周期性任务,和预定触发时间未过的一次性任务。后台 Bash 任务和 monitor 任务不会在恢复时恢复。

对于需要无人值守运行的 cron 自动化:

常见问题

/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 检查构建