You need to enable JavaScript to run this app. PM2的自动重启策略是什么?应用报错后未自动重启如何处理
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 10:09:03