如何让nodemon等待端口释放后再重启Node.js应用?
解决nodemon重启时端口占用的问题
以下几种方案可以解决nodemon重启前旧进程未释放端口的问题:
1. 自定义启动脚本,先清理端口再启动
直接修改package.json的start脚本,在启动nodemon前先清理占用4080端口的进程,避免报错:
"scripts": { "start": "kill -9 $(lsof -t -i:4080 2>/dev/null) || true && nodemon app.js", "test": "....." }
2>/dev/null:屏蔽端口未被占用时lsof的报错信息|| true:确保即使清理端口的命令执行失败(比如端口没被占用),后续的nodemon仍能正常启动
2. 让Node.js应用优雅退出
在你的app.js中添加信号监听,确保收到终止信号时正常关闭服务器、释放端口,从根源避免残留进程:
const express = require('express'); const app = express(); const server = app.listen(4080, () => { console.log('Server running on port 4080'); }); // 监听SIGINT(Ctrl+C)和SIGTERM(nodemon发送的终止信号) process.on('SIGINT', shutdown); process.on('SIGTERM', shutdown); function shutdown() { server.close(() => { console.log('Server closed, exiting process'); process.exit(0); }); }
这样nodemon重启时,旧进程会正常关闭端口,不会残留占用。
3. 配置nodemon的重启策略
创建nodemon.json配置文件,设置重启延迟和终止信号,给旧进程足够时间释放资源:
{ "restartDelay": 1000, "killSignal": "SIGTERM" }
restartDelay: 重启前等待1000毫秒(1秒),让旧进程有时间退出killSignal: 指定用SIGTERM信号终止旧进程,触发上面设置的优雅退出逻辑
4. 使用nodemon的--exitcrash参数
如果应用偶尔崩溃导致进程残留,可以添加--exitcrash参数,让nodemon在应用崩溃时强制退出旧进程:
"scripts": { "start": "nodemon --exitcrash app.js", "test": "....." }
内容的提问来源于stack exchange,提问作者zumzum
相关产品推荐
相关产品推荐

