PM2 缓存机制与更新策略指南
- 核心结论
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 只会复用这套旧的变量。
解决方案:必须强制更新环境上下文。
核心参数是 --update-env
pm2 restart <id|name> --update-env
2.3 现象三:服务器重启后,旧配置“复活”
原因:服务器重启自动恢复时,PM2 读取的是 ~/.pm2/dump.pm2 文件,而不是你当前的运行状态。如果你新增了进程但没保存,重启后就会丢失;如果你删除了进程没保存,重启后它会复活。
解决方案:每次变更进程状态(新增、删除、改参数)后,务必保存。
将当前运行列表保存为 dump 文件
pm2 save
3. 进阶配置:监听模式 (Watch Mode)
如果希望修改文件后自动清除“缓存”并重启,可以使用 Watch 模式(建议仅在开发环境使用)。
命令行启动:
pm2 start app.js --watch
配置文件 (ecosystem.config.js):
JavaScript
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 命令。
- 点赞
- 收藏
- 关注作者
评论(0)