PM2 缓存机制与更新策略指南
1. 核心结论
PM2 本身不缓存源代码文件,但它会将应用程序加载到内存中运行。因此,磁盘上文件的修改不会自动反映在正在运行的进程中。
所谓的“缓存问题”,通常由以下三个机制引起:
- 内存常驻:代码加载后长期存在于 RAM 中。
- 环境变量快照:启动时抓取并锁定了环境变量。
- 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 | # 核心参数是 --update-env |
2.3 现象三:服务器重启后,旧配置“复活”
原因:服务器重启自动恢复时,PM2 读取的是 ~/.pm2/dump.pm2 文件,而不是你当前的运行状态。如果你新增了进程但没保存,重启后就会丢失;如果你删除了进程没保存,重启后它会复活。
解决方案:每次变更进程状态(新增、删除、改参数)后,务必保存。
1 | # 将当前运行列表保存为 dump 文件 |
3. 进阶配置:监听模式 (Watch Mode)
如果希望修改文件后自动清除“缓存”并重启,可以使用 Watch 模式(建议仅在开发环境使用)。
命令行启动:
1 | pm2 start app.js --watch |
配置文件 (ecosystem.config.js):
JavaScript
1 | module.exports = { |
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 命令。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 小破站!
