一条命令,真实的 SIGTERM
用你实际的启动命令启动服务,等就绪检查通过、真实请求进入处理后,再发送信号。每一步都有计时。
shutdown-check 会启动你真实的服务,发出几个慢请求,趁它们还在处理时发送 SIGTERM,然后验证:这些请求全部完成,就绪状态已撤回,新请求被拒绝,进程在截止时间前退出。你的代码一行都不用改。
npm install -D shutdown-check支持任意 Node.js HTTP 服务零依赖Node.js 22+,支持 macOS 和 LinuxMIT 许可证
跟着同一个服务走完整个检查:终端里的运行、配置文件、时间线上的排空过程、失败时给出的信息,以及 CI 中的把关。
用你实际的启动命令启动服务,等就绪检查通过、真实请求进入处理后,再发送信号。每一步都有计时。
一个 JSON 文件写明启动命令、就绪检查路由和一个慢路由。不需要在应用里引入任何东西。
请求完成,就绪检查变为 503,新请求被拒绝,进程远在截止时间之前退出。
每个出错阶段都有固定的诊断码,并附上截至出错时的时间线、服务自身的输出和修复方法。
CI 任务可以按退出码判定失败,脚本可以读取 JSON,CI 也能直接展示 JUnit 报告。
$ npx shutdown-check test PASS SC000: Graceful shutdown verified Timeline: + 5 ms process launched — pid=67911 + 113 ms service ready — HTTP 200 + 113 ms work request sent — #1 GET /slow + 113 ms work request sent — #2 GET /slow + 114 ms work confirmed active — 2 response(s) sent headers; bodies still in progress + 114 ms signal sent — SIGTERM + 115 ms readiness withdrawn — HTTP 503 + 115 ms new request rejected — HTTP 503 + 566 ms work request finished — #1 HTTP 200 + 566 ms work request finished — #2 HTTP 200 + 573 ms process exited — code=0, signal=none + 574 ms shutdown verified — work completed and service exited before deadline $ echo $?0
{ "command": ["node", "dist/server.js"], "baseUrl": "http://127.0.0.1:3000", "readiness": { "path": "/health" }, "workload": { "path": "/slow", "concurrent": 2, "bodyIncludes": "work complete", "started": { "type": "response-headers" } }, "shutdown": { "deadlineMs": 5000, "readinessWithdrawal": true, "newRequests": { "path": "/new", "rejectStatuses": [503] } } }
两个进行中的请求,排空期间撤回就绪状态并拒绝新请求。终端演示里那次运行用的正是这份配置。
在 114 ms 发送 SIGTERM,此时有两个请求正在进行中。1 ms 后就绪检查开始返回 503,一个新请求也被拒绝,返回 503。两个请求都在 566 ms 完成,返回 HTTP 200;进程在 573 ms 以退出码 0 退出,远早于 5114 ms 的截止时间。
FAIL SC201: In-flight request was interrupted: aborted + 113 ms signal sent — SIGTERM + 114 ms work request finished — #1 aborted + 114 ms work request finished — #2 aborted + 576 ms process exited — code=0, signal=none
- run: npm run build - name: 测试优雅关闭 run: npx shutdown-check test --json --junit shutdown-result.xml
测试结果 · shutdown-result.xml
退出码不为 0 时,任务即失败