为何用PM2启动的极简Node.js应用持续自动重启?
问题排查与解决
核心原因
你的应用启动后会立即退出,因为app.js中的代码执行完所有逻辑后,没有任何维持进程存活的机制。PM2的默认行为是检测到进程退出时自动重启,以此保证应用持续运行,所以才会出现持续重启的情况。
看你的app.js代码:init方法仅打印日志,没有启动长期运行的服务(比如HTTP服务器),也没有挂起进程的逻辑。代码执行完毕后,Node.js进程会自然终止,PM2会判定进程异常退出,进而不断触发重启。
解决办法
方法1:添加维持进程存活的逻辑
如果是测试场景,可以手动挂起进程,在代码末尾添加:
// 阻止进程自动退出 process.stdin.resume();
如果是实际业务应用,建议启动一个长期运行的任务,比如HTTP服务:
const http = require('http'); class App { async init() { console.log('App started'); this.server = http.createServer((req, res) => { res.end('Hello World'); }); await new Promise(resolve => this.server.listen(3000, resolve)); console.log('Server running on port 3000'); } } const app = new App(); app .init() .catch(err => console.log('Error initializing app: ', err));
方法2:修改PM2配置禁用自动重启
如果你的需求就是让进程执行一次就退出,可以在ecosystem.config.js中添加autorestart: false:
module.exports = { apps: [ { name: 'main-app', script: './app.js', output: "./logs/app-out.log", error: "./logs/app-error.log", watch: false, autorestart: false // 新增:进程退出后不再自动重启 } ] };
验证步骤
- 查看PM2进程状态,确认进程是否频繁重启:
pm2 status
- 查看应用日志,确认进程退出的具体情况:
pm2 logs main-app
日志会显示进程启动后很快退出的记录,可进一步验证问题原因。
内容的提问来源于stack exchange,提问作者Zak
相关产品推荐
相关产品推荐

