Skip to content

自托管 runner 的 checkout 钩子默认 30 分钟超时:卡住的钩子不再一直占着槽位 ​

在自己的机器上跑 Claude Code 云会话(自托管 runner)时,每个会话开始前都有一个准备阶段:把代码检出到工作目录。很多团队会在这里挂一个 checkout 钩子,用来装依赖、拉子模块、准备缓存或注入配置。

钩子是你自己写的脚本,难免有卡住的时候:某个下载一直没响应、某条命令在等输入、私有源连不上。问题在于,旧版本里这样一个卡住的钩子可以无限期地挂着。

默认 30 分钟就停 ​

CLI 2.1.307 的更新说明里有一条行为变化:自托管 runner 的 checkout 钩子在 30 分钟后默认会被停止,会话的准备阶段随之失败。

如果你的钩子确实需要更久(比如首次构建一个很大的依赖缓存),说明里给了两个办法:

  • 调大 --checkout-hook-timeout-min,单位是分钟;
  • 把它设为 0,即不设超时。

同版本的 CLI 环境变量列表里还新增了 SELF_HOSTED_RUNNER_CHECKOUT_HOOK_TIMEOUT_MS,从名字看是同一个超时的毫秒版配置;官方更新说明没有单独解释它,用之前建议以官方文档为准。

顺带修掉的槽位泄漏 ​

和超时配套的是一条修复:在 checkout 钩子运行期间归档或重新排队一个会话,或者直接停止 runner,以前会让钩子的进程继续运行、runner 的槽位也一直被占着。 2.1.307 修好了这个问题。

这两件事加在一起,解决的是同一个现象:runner 上明明没有在干活的会话,却「满了」,新会话一直显示在等 runner。现在卡住的钩子到点会被停掉,中途取消的会话也会把进程和槽位一起清理干净。

升级前后可以检查什么 ​

  1. 量一下钩子平时跑多久:如果正常情况就接近或超过 30 分钟,升级前先把 --checkout-hook-timeout-min 调大,否则会话会在准备阶段失败;
  2. 给钩子里的网络操作加自己的超时:比起等 runner 30 分钟后统一掐断,让下载命令自己超时并输出清楚的错误,排查更快;
  3. 留意失败的会话:准备阶段因超时失败时,先看钩子日志卡在哪一步,再决定是修钩子还是放宽时限。

同版本其他自托管 runner 变化 ​

  • 使用 --use-anthropic-git-proxy 的会话,以前可能会把上一个会话留在克隆目录里的 .claude/settings.local.json 一起提交,已修复;
  • 为 Anthropic 托管 git 生成的证书文件,现在会像 CLI 一样过滤受信任证书,并用一行 [runner:warn] 报告被排除的数量;
  • 云会话界面上,自托管环境的「Waiting for a runner」状态不再被截断,按需 runner 会从你最后一条消息开始计时并显示失败的尝试。

小结 ​

  • 2.1.307 起,自托管 runner 的 checkout 钩子默认 30 分钟超时;
  • 需要更久就调大 --checkout-hook-timeout-min,设为 0 表示不限时;
  • 钩子运行中取消会话或停止 runner,不再残留进程、占着槽位。

Claude-cn.org,专注于 Claude Code 中文教程