# SC310：未撤回就绪状态

> SC310（未撤回就绪状态）表示收到 SIGTERM 后直到截止时间，就绪检查路由仍然报告就绪。收到 SIGTERM 时应返回 503，或者停止监听。

Source: https://shutdown.jscrate.dev/zh/docs/codes/sc310
Last updated: 2026-09-23

`SC310` 表示收到 `SIGTERM` 之后，就绪检查路由仍在报告就绪。负载均衡器可能会继续把流量发给这个已经在关闭的实例。

| | |
| --- | --- |
| 诊断码 | `SC310` (FAIL) |
| 阶段 | 排空流量 |
| CLI 退出码 | 1 |
| 含义 | 开启 `readinessWithdrawal` 后，从收到 SIGTERM 一直到截止时间，就绪检查路由仍在返回就绪状态码。 |
| 输出信息 | `Readiness was not withdrawn before the shutdown deadline` |
| 首先检查 | 收到 SIGTERM 时，让就绪检查路由返回 503（或者停止监听），这样负载均衡器就不再发送流量。 |

## 如何撤回就绪状态？

信号一到就设置一个排空标志，并让就绪检查路由返回表示未就绪的状态码：

```js
let draining = false;

app.get("/health", (_request, response) => {
  response.sendStatus(draining ? 503 : 200);
});

process.on("SIGTERM", () => {
  draining = true;
  server.close();
});
```

关闭监听器也算撤回，因为就绪检查的连接会被拒绝。就绪检查请求超时则不算撤回，因为这会让流量状态变得不明确。

## 如何确认已修复？

时间线应在 `signal sent` 之后不久记录 `readiness withdrawn`。在可控的排空过程中手动测试这个路由，确认它从就绪状态码变成 `503` 或其他表示未就绪的状态码。

如果应用的状态变了，测试却没有观察到，检查 `readiness.path` 是否指向平台使用的同一个路由。

## 相关内容

- [就绪检查与排空](https://shutdown.jscrate.dev/zh/docs/guides/readiness-and-draining)
- [启用就绪状态撤回](https://shutdown.jscrate.dev/zh/docs/configuration#shutdown)
- [SC311：接受了新请求](https://shutdown.jscrate.dev/zh/docs/codes/sc311)
- [Kubernetes 中的关闭](https://shutdown.jscrate.dev/zh/docs/guides/kubernetes)
