PM2的自动重启策略是什么?应用报错后未自动重启如何处理
PM2 自动重启策略及报错不重启问题排查方案
核心问题根因
PM2 默认的自动重启触发条件只有Node 进程主动崩溃退出,你遇到的两类场景都是框架自身捕获了异常、未导致进程终止,PM2 感知不到异常所以不会触发重启:
- Next.js 内置的服务端渲染异常捕获逻辑会拦截 React 渲染错误,仅输出日志、返回错误页,进程本身保持运行状态
- Koa 默认的请求链路错误处理会捕获接口逻辑抛出的 JS 异常,仅返回 500 响应、打印错误,不会终止进程
PM2 标准自动重启策略配置
你可以按需配置以下重启规则,适配不同业务场景:
- 内存阈值重启:配置
max_memory_restart参数,进程占用内存超过阈值时自动重启
启动命令示例:pm2 start server.js --max_memory_restart 512M
ecosystem.config.js 配置示例:module.exports = { apps: [{ name: "your-app", script: "./server.js", max_memory_restart: "512M" }] } - 崩溃次数限制:搭配
min_uptime和max_restarts参数,设置进程最小正常运行时长、以及该时长内的最大重启次数,避免异常进程无限循环重启 - 僵死进程处理:配置
kill_timeout参数,设置进程收到终止信号后的等待时长,超时后PM2会强制杀死进程触发重启
你的场景专属解决方案
如果需要在框架捕获到指定错误时触发PM2重启,只要在应用的全局错误处理逻辑中,识别到严重错误时主动终止进程即可:
Koa 应用配置示例
在全局错误中间件中增加判断,致命错误触发进程退出:
app.use(async (ctx, next) => { try { await next() } catch (err) { console.error('请求异常:', err) // 自定义判断逻辑,符合条件时终止进程 if (err.needRestart) { process.exit(1) } ctx.status = err.status || 500 ctx.body = err.message } })
Next.js 应用配置示例
在自定义全局错误文件 app/global-error.js(Next.js 13+)或 pages/_error.js 中增加服务端错误判断:
if (typeof window === 'undefined') { // 服务端渲染错误,符合条件时终止进程 if (error.needRestart) { process.exit(1) } }
基础配置排查
如果配置后依然无法自动重启,先检查以下基础配置:
- 执行
pm2 show <应用名>查看autorestart字段是否为enabled,如果为关闭状态,启动时添加--autorestart参数即可开启 - 确认启动命令/配置文件中没有添加
--no-autorestart参数或autorestart: false配置
内容的提问来源于stack exchange,提问作者Demon.FE
相关产品推荐
相关产品推荐

