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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 15:20:33