1. 核心结论

PM2 本身不缓存源代码文件,但它会将应用程序加载到内存中运行。因此,磁盘上文件的修改不会自动反映在正在运行的进程中。

所谓的“缓存问题”,通常由以下三个机制引起:

  1. 内存常驻:代码加载后长期存在于 RAM 中。
  2. 环境变量快照:启动时抓取并锁定了环境变量。
  3. Dump 快照pm2 save 生成的进程列表快照。

2. 常见“缓存”现象与解决方案

2.1 现象一:修改代码后,运行的还是旧逻辑

原因:Node.js (或 Python 等) 解释器将代码加载到内存后,除非进程重启,否则不会重新读取磁盘上的文件。

更新方式 命令 特点 适用场景
暴力重启 pm2 restart <id> 杀死进程 –> 重新启动 开发环境 / 单实例应用
平滑重载 pm2 reload <id> 逐步重启集群中的实例 (Cluster Mode) 生产环境 (实现 0 秒停机)

2.2 现象二:修改环境变量或配置文件后无效

原因:PM2 在应用首次启动时,会通过 process.env 读取当前系统的环境变量并将其持久化在 PM2 的内部配置中。后续单纯的 restart 只会复用这套旧的变量。

解决方案:必须强制更新环境上下文。

1
2
# 核心参数是 --update-env
pm2 restart <id|name> --update-env

2.3 现象三:服务器重启后,旧配置“复活”

原因:服务器重启自动恢复时,PM2 读取的是 ~/.pm2/dump.pm2 文件,而不是你当前的运行状态。如果你新增了进程但没保存,重启后就会丢失;如果你删除了进程没保存,重启后它会复活。

解决方案:每次变更进程状态(新增、删除、改参数)后,务必保存。

1
2
# 将当前运行列表保存为 dump 文件
pm2 save

3. 进阶配置:监听模式 (Watch Mode)

如果希望修改文件后自动清除“缓存”并重启,可以使用 Watch 模式(建议仅在开发环境使用)。

命令行启动:

1
pm2 start app.js --watch

配置文件 (ecosystem.config.js):

JavaScript

1
2
3
4
5
6
7
8
9
10
module.exports = {
apps: [{
name: "my-app",
script: "./app.js",
watch: true,
// 建议忽略并不需要重启的文件夹(如日志、静态资源)
ignore_watch: ["node_modules", "logs", "static"],
watch_delay: 1000 // 延迟 1 秒重启,避免频繁触发
}]
}

4. 故障排查速查表 (Cheat Sheet)

遇到“修改不生效”时,请按以下顺序操作:

场景 操作命令 备注
常规代码更新 pm2 reload all 生产环境首选,保持服务在线
安装了新 npm 包 pm2 restart all node_modules 变更通常需要硬重启
修改环境变量 pm2 restart <id> --update-env 最容易被遗忘的操作
修改 ecosystem 配置 pm2 start ecosystem.config.js 重新应用整个配置文件的变更
彻底清理重置 pm2 delete all –> pm2 start ... 解决不明原因的缓存幽灵

5. 常见误区提示

Warning

不要手动修改 ~/.pm2/ 下的文件:PM2 的内部状态管理很复杂,手动修改 dump 文件通常会导致数据损坏。请始终使用 pm2 save 和 pm2 update 命令。