Shutdown Check

搜索文档

查找页面或章节

SC200:进行中的请求未完成

SC200(进行中的请求未完成)表示收到 SIGTERM 时正在处理的请求,没能在关闭截止时间前完成。本文列出常见原因和修复方法。

SC200 表示关闭截止时间到了,一个进行中的请求仍未结束。它既没有完成,也没有失败,连接一直开着。

诊断码SC200 FAIL
阶段进行中请求的响应
CLI 退出码1
含义收到 SIGTERM 时正在运行的请求,没有在关闭截止时间前完成。
输出信息
  • In-flight request #<n> did not finish within <shutdown.deadlineMs> ms
首先检查用 server.close() 停止接受连接,让未完成的请求完成;不要等待永远不会结束的 keep-alive socket 或定时器。

请求为什么会卡住?

  • 关闭处理函数在等请求结束,而请求又在等关闭时的清理完成。
  • 某个数据库调用、上游请求或锁一直没有结束。
  • 服务器停止了读写,却没有关闭响应。
  • shutdown.deadlineMs 比这个操作预期需要的时间短。
  • 某个定时器或流没有关闭。

如何修复?

  1. 在慢的处理函数和每个关闭步骤前后加日志。
  2. 先让进行中的处理函数完成,再关闭它们依赖的资源。
  3. 给网络、数据库和队列操作设置超时。
  4. 把 deadlineMs 设得比最慢的正常请求更长,但要短于平台的强制终止时限。

不要用 process.exit() 来消除这个诊断码。这样会切断连接,把失败变成 SC201。

如何确认已修复?

时间线中应在截止时间之前出现 work request finished。如果一个看起来正常的响应仍可能掩盖没做完的工作,就加上 bodyIncludes。

用最慢的正常操作来测试,不要只用固定的 sleep。如果外部系统可能卡住,把它们自己的超时处理路径作为单独的失败场景来测试。