跳转到主要内容
会话范围的定时任务让 Claude 在 Claude Code 会话中按间隔自动重新运行提示词。使用它们来轮询部署、监督 PR、检查长时间运行的构建,或在会话中稍后提醒自己做某事。
以下情况在其他页面中介绍:
  • 对事件进行实时反应而不是轮询:请参阅 Channels。您的 CI 可以直接将失败推送到会话中。
  • 让会话逐轮次持续工作直到满足某个条件,而不是按间隔运行:请参阅 /goal。
任务是会话范围的。当您使用 --resume 或 --continue 恢复时,Claude Code 会恢复尚未过期的任务,除了限制下列出的任务。对于独立于任何会话而存在的调度,请创建云端定时任务、设置 Desktop 定时任务,或使用 GitHub Actions。

比较调度选项

Claude Code 提供三种方式来安排定期或一次性工作:
对于应该在没有您的机器的情况下可靠运行的工作,使用云任务。当您需要访问本地文件和工具时,使用桌面任务。对于会话期间的快速轮询,使用 /loop。

使用 /loop 重复运行提示词

/loop 随附 skill 是在会话保持打开期间重复运行提示词的最快方式。间隔和提示词都是可选的,您提供的内容决定了循环的行为方式。 您也可以将 skill 作为提示词传入,例如 /loop 20m /review-pr 1234,以便在每次迭代时重新运行该 skill。定时触发只会运行 Claude 可以自行调用的 skill。以下内容会以纯文本形式传给 Claude,而不会被执行:

按固定间隔运行

当您提供间隔时,Claude 会将其转换为 cron 表达式,安排该任务,并确认执行频率和任务 ID。
间隔可以作为单独的标记(如 30m)放在提示词之前,也可以作为从句(如 every 2 hours)放在提示词之后。支持的单位有:s 表示秒,m 表示分钟,h 表示小时,d 表示天。 由于 cron 的粒度为一分钟,秒数会向上取整到最接近的分钟。无法映射为整齐 cron 步长的间隔(例如 7m 或 90m)会被舍入到最接近的可映射间隔,Claude 会告诉您它选择了哪个间隔。

让 Claude 选择间隔

当您省略间隔时,Claude 会动态选择间隔,而不是按固定的 cron 计划运行。每次迭代后,它会根据观察到的情况选择一分钟到一小时之间的延迟:在构建即将完成或 PR 处于活跃状态时等待较短时间,在没有待处理事项时等待较长时间。所选的延迟及其原因会在每次迭代结束时输出。 以下示例会检查 CI 和评审意见,一旦 PR 安静下来,Claude 会在迭代之间等待更长时间:
在 Monitor 工具可用的会话中,当您请求动态 /loop 计划时,Claude 可能会直接使用该工具。Monitor 会运行后台脚本并将每一行输出流式传回,从而完全避免轮询,并且通常比按间隔重新运行提示词更节省 token、响应更及时。 动态安排的循环会像其他任务一样出现在您的定时任务列表中,因此您可以用相同的方式列出或取消它。列表将其待处理的唤醒显示为一次性任务,因此安排在 :00 或 :30 的唤醒可能会稍早运行。七天过期规则同样适用于该循环。
动态选择的间隔和内置维护提示词适用于所有提供商,并且在关闭功能标志获取时同样可用。在 Amazon Bedrock、Claude Platform on AWS、Google Cloud 的 Agent Platform 和 Microsoft Foundry 上,或在关闭获取的情况下,这两项功能都需要 Claude Code v2.1.248 或更高版本。

运行内置维护提示词

当您省略提示词时,Claude 会使用内置维护提示词,而不是您提供的提示词。在每次迭代中,它会按顺序处理以下事项:
  • 继续对话中任何未完成的工作
  • 处理当前分支的 Pull Request:评审意见、失败的 CI 运行、合并冲突
  • 在没有其他待处理事项时,执行清理工作,例如查找 bug 或简化代码
每次运行在推送或删除任何内容之前,都会经过会话的权限检查。 单独的 /loop 会以动态选择的间隔运行此提示词:
添加间隔(例如 /loop 15m)即可改为按固定计划运行。要用您自己的默认提示词替换内置提示词,请参阅使用 loop.md 自定义默认提示词。

使用 loop.md 自定义默认提示词

创建 loop.md 文件,即可用您自己的指令替换内置维护提示词。它为单独的 /loop 定义单个默认提示词,而不是一组独立的定时任务,并且每当您在命令行中提供提示词时,Claude Code 都会忽略该文件。要在其之外安排其他提示词,请使用 /loop <prompt> 或直接询问 Claude。 Claude 会在两个位置查找该文件,并使用找到的第一个文件。 该文件是纯 Markdown,没有必需的结构。像直接输入 /loop 提示词一样编写即可。以下示例用于保持发布分支的健康状态:
.claude/loop.md
对 loop.md 的编辑会在下一次迭代时生效,因此您可以在循环运行期间完善指令。当两个位置都不存在 loop.md 时,循环会回退到内置维护提示词。请保持文件简洁:超过 25,000 字节的内容会被截断。

停止循环

在自定节奏模式下,Claude 也可以在任务完成后自行结束循环。Claude 会使用 stop: true 调用 ScheduleWakeup 工具,从而立即取消待处理的唤醒。如果某次迭代结束时既没有重新安排也没有停止,Claude Code 会在大约 20 分钟后安排一次备用唤醒,如果该次迭代也没有重新安排,则结束循环。

分离而不停止循环

当您附加到后台会话且 Claude 处于空闲状态时,在空输入框中按两次 Ctrl+C 即可分离。在那里等待下一次迭代的自定节奏循环会继续运行,且该次迭代会按计划开始。如果要停止循环,请在分离之前按 Esc。使用 Ctrl+C 分离而不停止循环需要 Claude Code v2.1.295 或更高版本。

设置一次性提醒

对于一次性提醒,用自然语言描述您想要的内容,而不是使用 /loop。Claude 计划一个单次触发的任务,该任务在运行后删除自己。
Claude 使用 cron 表达式将触发时间固定到特定的分钟和小时,并确认何时触发。

管理会话范围的定时任务

用自然语言要求 Claude 列出或取消任务,或直接引用底层工具。
这些是 Claude 使用的底层工具: 每个计划任务都有一个 8 字符的 ID,您可以将其传递给 CronDelete。一个会话最多可以同时保存 50 个计划任务。

会话范围的定时任务如何运行

调度程序每秒检查一次到期的任务,并以低优先级将其加入队列。计划的提示词在您的回合之间触发,而不是在 Claude 正在响应时。如果 Claude 在任务到期时忙碌,提示词会等到当前回合结束。 所有时间都在您的本地时区中解释。像 0 9 * * * 这样的 cron 表达式意味着 9am 在您运行 Claude Code 的任何地方,而不是 UTC。

抖动

定时任务的实际运行时间可能与其计划时间不同。如果每个会话的任务都严格按计划运行,许多任务会在同一时刻调用 API,因此 Claude Code 会调整每个任务的运行时间。重复任务会延后运行,但每五分钟运行一次的任务(写作 */5 * * * *)除外。安排在整点或半点的一次性任务会稍微提前运行。 要查看任务下次到期的时间,请查看终端中 Claude 的 CronCreate 调用下方的行。该行会在计划之后显示该时间,例如 next run 10:21 AM。之后如需再次查看,请让 Claude 列出您的任务,并在 CronList 调用下方的行中查找 next run。这些行中的下次运行时间需要 Claude Code v2.1.299 或更高版本。

重复任务会延后多久运行

除非每五分钟运行一次,否则重复任务的每次运行都会延后开始,延后时长最多为距下一次运行间隔的一半,且最多不超过 30 分钟。您的任务属于以下三种情况之一:
  • 运行间隔均匀:间隔相等的任务(例如每小时、每天或每 10 分钟运行一次)每次都会延后相同的分钟数运行,包括在会话空闲时。
  • 运行间隔不均匀:间隔不等的任务(例如安排在每小时 :00 和 :15 运行的任务)每次运行延后的分钟数可能不同。
  • 每五分钟:写作 */5 * * * * 的任务不会被延迟。恰好在上一次运行五分钟后开始的运行,会在五分钟的提示缓存过期后才开始,因此每次运行都会提前 15 秒开始。
在此表的第一列中找到您的计划,即可查看其每次运行的开始时间。 例如,7,37 * * * * 将任务安排在 :07 和 :37 运行,两者相隔 30 分钟,因此其延迟介于 0 到 15 分钟之间。如果该任务的延迟为 14 分钟,它会在每小时的 :21 和 :51 运行。将计划更改为其他分钟会改变运行时间,但仍会在其基础上添加延迟。

一次性任务何时提前运行

安排在 :00 或 :30 的一次性任务最多会提前 90 秒运行。Claude Code 不会调整安排在其他任何分钟的一次性任务,因此当时间很重要时,请避开整点和半点进行安排:使用 3 9 * * * 而不是 0 9 * * *。

七天过期

重复任务在创建后 7 天自动过期。任务最后触发一次,然后删除自己。这限制了被遗忘的循环可以运行多长时间。如果您需要重复任务持续更长时间,请在过期前取消并重新创建它,或使用云端定时任务或 Desktop 定时任务进行持久调度。

Cron 表达式参考

CronCreate 接受标准 5 字段 cron 表达式:minute hour day-of-month month day-of-week。所有字段都支持通配符 (*)、单个值 (5)、步长 (*/15)、范围 (1-5) 和逗号分隔的列表 (1,15,30)。 星期几使用 0 或 7 表示星期日,6 表示星期六。不支持扩展语法如 L、W、? 和名称别名如 MON 或 JAN。 当月份日期和星期几都受到限制时,如果任一字段匹配,日期就匹配。这遵循标准的 vixie-cron 语义。

禁用会话范围的定时任务

在您的环境中设置 CLAUDE_CODE_DISABLE_CRON=1 以完全禁用调度程序。CronCreate 和 /loop 变得不可用,任何已计划的任务都停止触发。当项目的 .claude/scheduled_tasks.json 文件中存有任务时,CronList 和 CronDelete 仍然可用,因此您仍可以让 Claude 列出或取消这些任务。有关禁用标志的完整列表,请参阅环境变量。

限制

会话范围的调度有固有的限制:
  • 任务仅在 Claude Code 运行且空闲时触发。关闭终端或让会话退出会停止它们触发。将会话放在后台会将 /loop 任务转移到后台会话,该会话继续运行而无需终端。
  • 没有错过触发的追赶。如果任务的计划时间在 Claude 忙于长时间运行的请求时经过,它会在 Claude 变为空闲时触发一次,而不是每个错过的间隔触发一次。
  • 在后台会话中,如果自定步调的循环的下一次唤醒到期时会话进程未在运行(例如发生崩溃之后),该循环会停止。当进程再次启动时,会话记录会显示一条说明该唤醒不会触发的通知。要继续该循环,请回复该会话并要求 Claude 保持其运行。
  • 当您使用 claude --resume 或 claude --continue 恢复会话时,Claude Code 会恢复使用 CronCreate 调度的任务,除了已过期的重复任务和计划时间已经过去的一次性任务。自定步调的 /loop不会被恢复,因此请再次运行 /loop 以重新启动它。
  • 恢复的重复任务不会为会话未运行期间错过的运行而触发。其下一次运行是您恢复后第一个到期的运行,并且抖动适用于该次运行。
  • 当您使用 claude --resume 或 claude --continue 恢复时,Claude Code 不会重新启动会话结束时正在运行的后台 Bash 命令和监视器。如果您仍然需要其中某一个,请让 Claude 重新启动它。
  • 当功能标志获取关闭时,Claude Code 会将您要求在会话间保留的任务存储在项目的 .claude/scheduled_tasks.json 文件中。当 .claude 目录或该文件是符号链接时,Claude Code 会返回错误而不是调度任务。保存的任务仅在您创建它的项目文件夹中运行。如果您将文件复制到另一个文件夹(例如新的 worktree),那里的会话会列出复制的任务但不会运行它们,因此请在该文件夹中再次创建任务。
对于需要无人值守运行的 cron 驱动自动化: