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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 20:13:12