Windows系统Git Bash关闭时如何终止Node.js的Express与WebSocket服务
问题解决:Windows Git Bash关闭终端时Node.js进程未终止导致端口占用
根因说明
Windows环境下的Git Bash是模拟POSIX的终端环境,关闭窗口时,bash进程不会将终止信号转发给子Node.js进程,导致Node进程变成孤儿进程继续运行,占用端口无法释放。你监听的各类信号根本没传递到Node进程,所以无效。
解决方案
方案1:改用Windows原生终端启动服务
直接使用CMD或PowerShell运行启动脚本:
ts-node ./src/server/server.ts
原生终端在关闭时会自动终止所有子进程,无需额外处理信号监听,是最省心的解决方式。
方案2:在Git Bash中用bash陷阱捕获退出事件
如果必须用Git Bash,在启动服务前添加bash的trap命令,让终端退出时自动杀死Node子进程:
trap 'pkill -TERM -P $$' EXIT ts-node ./src/server/server.ts
pkill -TERM -P $$会杀死所有父进程为当前bash的子进程,确保Node服务随终端关闭而终止。
方案3:优化Node进程的退出逻辑(辅助加固)
即使信号能传递到进程,你的原代码也存在异步清理未完成就退出的问题,可统一优化退出逻辑:
const server = app.listen(8000, () => { console.log(`Server is running on port 8000`); }); // 统一处理退出逻辑,确保异步资源清理完成 const handleExit = (signal: string) => { console.log(`Received ${signal}, shutting down...`); wss.close((err) => { err && console.error('WebSocket关闭失败:', err); server.close((err) => { err && console.error('HTTP服务器关闭失败:', err); writeFileSync('./1.txt', signal); process.exit(err ? 1 : 0); }); }); }; // 只监听Windows/Git Bash可能传递的关键信号即可 process.on('SIGINT', () => handleExit('SIGINT')); process.on('SIGTERM', () => handleExit('SIGTERM')); process.on('SIGBREAK', () => handleExit('SIGBREAK')); // Windows特有的中断信号
server.close()和wss.close()都是异步操作,原代码直接调用process.exit()会导致资源未完全释放,改成在回调中执行退出更可靠。
内容的提问来源于stack exchange,提问作者Eugene1111
相关产品推荐
相关产品推荐

