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

如何修复PM2运行时代码修改后变更未生效的问题

PM2 Windows集群模式代码变更偶发不生效修复方案

1. 调整PM2重启策略,避免文件锁残留

Windows系统文件句柄释放逻辑和Linux不同,PM2默认的滚动重启策略会出现前一个实例未完全退出、文件锁未释放的情况,新启动的实例会读取到旧文件内容。
在PM2配置文件ecosystem.config.js中添加以下配置即可解决:

module.exports = {
  apps : [{
    name: "你的服务名称",
    script: "./入口文件.js",
    instances: 4, // 和你的CPU核心数对应
    exec_mode: "cluster",
    // 核心配置:强制所有旧实例退出后再启动新实例
    kill_timeout: 3000, // 给旧进程3秒优雅退出时间,超时强制杀死
    restart_delay: 1000, // 所有实例杀完后等1秒再启动新实例,确保文件锁完全释放
    cwd: "你的项目绝对路径", // 固定工作目录,避免相对路径加载到旧代码
    watch: true,
    ignore_watch : ["node_modules", "logs", ".git"], // 忽略不需要监听的目录
  }]
}

2. 适配Windows文件监听逻辑,避免变更通知丢失

PM2默认用系统级文件通知监听变更,Windows平台下偶发通知丢失导致重启不及时或者加载旧文件,改用轮询模式监听即可解决,在上面的配置中新增watch_options配置:

watch_options: {
  usePolling: true, // 开启轮询模式适配Windows
  interval: 1000 // 轮询间隔,单位毫秒,项目大可调整为2000-3000降低CPU占用
}

3. 清除Node.js模块缓存,强制加载最新代码

Node.js默认会缓存已加载的模块,偶发会出现重启后仍然读取缓存的旧模块的情况,在项目入口文件最顶部添加以下代码即可:

// 启动时清空所有已缓存的模块,强制读取最新文件
Object.keys(require.cache).forEach(key => delete require.cache[key])

4. 编译类项目额外适配

如果你的项目需要经过编译(比如TS、NestJS、前端SSR项目等),要确保编译完成后再触发PM2重启,避免PM2监听到源文件变更就提前重启,加载到还没更新的编译产物。可以直接用命令绑定编译和重启步骤:

npm run build && pm2 reload all --force

其中--force参数会强制杀死所有旧进程后再启动新实例,完全等效你之前手动执行的pm2 stop all + pm2 kill + 逐个启动的操作,不需要拆分执行多步命令。


内容的提问来源于stack exchange,提问作者Temp O'rary

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 14:57:02