shutdown-check 是一个黑盒测试工具,专门回答一个部署问题:Node.js HTTP 服务收到 SIGTERM 后,能否处理完进行中的请求并干净地退出?
为什么要做这个项目?
关闭处理函数在代码评审时看起来没问题,在真实进程中却仍可能失败。启动命令可能多套了一层包装进程,框架处理 socket 的方式可能与预期不同,某个请求可能仍依赖正在关闭的资源,某个定时器也可能让 Node.js 一直无法退出。
单元测试很有价值,但它们通常直接调用处理函数,并 mock 掉部署时真正会出问题的部分。shutdown-check 会运行真实的命令,建立真实的 HTTP 连接,发送操作系统信号,并等待进程真正退出。
shutdown-check 是什么
- 一个 CLI 和带类型的 Node.js API。
- 针对本地 HTTP/1 服务的测试。
- 基于真实进程和真实信号的测试。
- 检查进行中的响应、可选的流量排空、进程退出和端口关闭。
- 用于 macOS 和 Linux 上的本地开发和 CI。
shutdown-check 不是什么
- 它不是关闭处理库。
- 它不会修改你的应用。
- 它不绑定 Express、Fastify、NestJS 或其他任何框架。
- 它不会运行 Kubernetes 集群或负载均衡器。
- 它不检查数据库、队列、WebSocket 或 HTTP/2 会话。
- 它不支持 Windows 原生的信号行为。
对比页面介绍了它如何与关闭库、单元测试、脚本和预发布环境测试配合使用。
设计原则
测试真实的边界
测试观察的输入和输出,正是部署平台所用的那些:命令、端口、HTTP、信号和退出状态。
不制造虚假的通过
发送 SIGTERM 前,必须先证明有工作正在进行。启动前端口必须空闲,退出后端口必须已关闭。可选检查只在它要测试的状态仍然存在时才会执行。
失败要能指导修复
每种已定义的失败都有稳定的 SC 码、一条消息、一条时间线,以及一个列出原因和修复方法的页面。出于同样的原因,CLI 会保留服务输出的最后一部分。
配置保持明确
配置文件写明命令、路由、预期响应、截止时间和排空行为。工具不会替你猜测服务应该使用哪个接口或哪个退出码才算正确。
项目范围
当前版本专注于:
SIGTERM- 本地明文 HTTP/1
- Node.js 22 或更高版本
- macOS 和 Linux
- ESM 和 CommonJS
- 文本、JSON 和 JUnit 输出
如果要测试超出这个范围的协议或环境,请先阅读兼容性与限制,再设计测试。
维护者与许可证
shutdown-check 由 Sohail Khan 维护,以 MIT 许可证发布。源码、issue 记录和版本发布都公开进行。
在遵守许可证条款的前提下,你可以使用、修改和分发本项目。完整条款见包或仓库中的 LICENSE 文件。
报告问题
提交 issue 之前:
- 运行最新版本。
- 阅读对应诊断码的页面。
- 查看故障排查。
- 尽可能把问题缩小到一个小型服务器和配置。
请提供:
- shutdown-check 版本
- Node.js 版本
- 操作系统
- 你运行的命令
- 去除敏感信息后的配置
- 完整的结果码、消息和时间线
- 捕获到的相关 stdout 和 stderr
- 可复现的仓库或小型服务器(如果有)
切勿包含密码、token、连接字符串、私有 URL、客户数据或其他敏感信息,请用清晰的占位符代替。