You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何按下Ctrl+C中断Node.js服务器后端口未自动关闭?

EADDRINUSE 错误原因及 Node.js 默认行为解析

这不是 Bug,本质是 TCP 协议的TIME_WAIT机制导致的。当你直接中断 Node.js 进程(比如按 Ctrl+C),操作系统不会立刻释放占用的端口,而是会将端口置于 TIME_WAIT 状态一段时间(通常几十秒),这是为了确保网络中残留的数据包被正确处理,避免出现数据错乱的情况。

Node.js 在收到 SIGINT(即终端中断信号,比如 Ctrl+C)时,默认不会自动关闭服务器的监听套接字。这是因为 Node.js 设计时允许进程在收到中断信号后,完成自定义的清理工作(比如保存未写完的数据、关闭数据库连接等),而不是直接强制终止所有资源。如果你的代码里没有显式监听 SIGINT 并主动关闭服务器,进程退出后操作系统会接管套接字,但触发 TIME_WAIT 是正常的网络协议行为,并非 Node.js 的问题。

你手动杀死占用端口的 PID 能解决问题,是因为这种方式会强制终止进程并立刻回收资源,但实际上等 TIME_WAIT 超时后,端口也会自动释放,只是需要等待一段时间。

你提到的监听 SIGINT 并调用 process.exit() 的方法可以优化,但更规范的做法是先主动关闭服务器再退出进程,这样能让端口被优雅释放,避免进入 TIME_WAIT 状态:

const express = require('express');
const app = express();
const server = app.listen(3000);

process.on('SIGINT', () => {
  server.close(() => {
    console.log('服务器已关闭,端口已释放');
    process.exit(0);
  });
});

内容的提问来源于stack exchange,提问作者Joaquin Rodriguez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 22:02:03