PM2
定义
PM2 是 Node.js 运行环境下的生产用进程管理器,官方将其描述为带有内置负载均衡器的生产环境进程管理工具,能够持续保持应用存活、在不中断服务的前提下重载应用并集中管理日志[1][3]。它以守护进程的方式在后台托管应用,用户通过命令行子命令完成启动、停止、重启、删除与查看状态等操作。
PM2 最初为 Node.js 设计,但其启动命令也可用于解释执行的脚本和可执行文件,例如通过指定解释器运行为 Python、Ruby 或 shell 脚本,因此常被当作通用的进程守护工具使用[4]。项目在 npm 上以 pm2 为包名分发,通常以全局方式安装后使用。
原理
PM2 启动应用后先拉起一个常驻守护进程,由它派生并托管各个被管理的应用进程,同时记录进程编号、名称、重启次数、CPU 与内存占用等元数据,供列表与详情命令读取。应用退出后,守护进程按设定的策略自动重启;可配置重启延迟、最小存活时长、最大重启次数以及按 cron 表达式定时重启等规则[1]。
PM2 提供 fork 与 cluster 两种执行模式。fork 模式等同于直接以单进程方式运行应用;cluster 模式会依据 CPU 核心数派生多个实例,并在实例之间分摊 HTTP、TCP、UDP 连接,其底层依赖 Node.js 的 cluster 模块,使子进程可以共享监听端口,无需修改业务代码[5]。实例数量可用 max 表示全部核心、-1 表示核心数减 1,也可填写具体数字[5]。
重启语义上,restart 会终止进程再重新拉起,服务出现短暂中断;reload 则先派生新工作进程,待其可以接受连接后再关闭旧进程,用于实现零停机更新。若重载在超时时间内未完成,PM2 会回退为普通重启[5]。为配合平滑退出,应用可以捕获 PM2 首先发送的 SIGINT 信号,在退出前关闭数据库连接或处理完剩余请求[5]。
对于多应用场景,PM2 使用配置文件(ecosystem 文件,可为 js、json 或 yaml 格式)声明每个应用的脚本路径、实例数、执行模式、环境变量、日志文件与重启阈值等属性,再由一条命令批量启动[6]。日志方面,PM2 收集被管理进程的标准输出与错误输出,支持实时查看、按格式输出与清空;日志轮转需借助 pm2-logrotate 模块实现[4]。
发展历程
PM2 由法国开发者 Alexandre Strzelewicz 于 2013 年编写,首个版本发布于 2013 年 6 月 27 日。其起因是当时缺少专门面向 Node.js 的应用守护与监控方案,作者希望工具部署在服务器与应用程序之间,一台服务器运行一个 PM2 来管理本机进程[2][7]。
2014 年,作者在 PM2 之上创办 Keymetrics 公司,提供面向 PM2 的 Web 监控仪表盘服务;PM2 本身仍以开源形式维护[7][8]。据 2016 年 12 月的统计,项目累计下载超过 2000 万次,贡献者约 140 人;同年前后,它曾在 GitHub 的 JavaScript 项目中进入受欢迎程度前列[7][9]。
版本迭代方面,3.0.0 于 2018 年 6 月发布,移除了 gracefulReload 命令与对 Node.js 0.12 的支持,并调整了日志合并的默认行为[10]。维基百科记载的稳定版为 5.3.1,发布于 2024 年 1 月 20 日[2]。
应用
PM2 的典型用途是在服务器上长期运行 Web 服务与后台作业。常见命令包括以 pm2 start 启动并命名应用、以 pm2 list 查看全部进程状态、以 pm2 monit 打开终端内的 CPU 和内存实时面板,以及用 pm2 logs 跟踪输出。
在可用性方面,pm2 startup 可以按系统自动生成开机自启脚本,支持 systemd、upstart、launchd 与 rc.d 等初始化系统;配合 pm2 save 固化进程列表,服务器重启后由已保存的快照恢复应用[4][1]。PM2 还内置部署系统,可通过 SSH 在一台或多台服务器上执行初始化、更新与回滚[1]。
对容器场景,PM2 提供 pm2-runtime 命令作为 node 命令的替代入口,用于在前台运行应用并适配容器生命周期[4]。此外,PM2 支持以 pm2 serve 将静态文件通过 HTTP 提供,并提供模块机制,可安装日志轮转、服务器状态监控等模块扩展功能[1]。在代码层面,PM2 还公开 JavaScript 接口,便于在程序内部调用启动、停止与事件订阅[1][6]。
局限
cluster 模式及其连接分摊能力仅适用于 Node.js 应用,其他语言编写的脚本只能以 fork 模式运行,无法借助该机制利用多核并行[5]。同时,cluster 模式要求应用本身无状态,会话、WebSocket 连接等数据不应保存在进程内存中,否则需要借助外部存储来共享状态[5]。
零停机重载并非在所有情况下都能实现。如果应用退出时仍有未关闭的连接,重载可能耗时过长或被判定为失败,从而回退为带有短暂中断的普通重启[5]。日志轮转也不属于默认能力,需要另行安装模块才能按大小或时间切分日志文件[4]。
PM2 的定位是单机进程管理,其设计预设为一台服务器运行一个 PM2 实例管理本机进程,跨服务器的统一监控依赖其配套的 Web 服务[7]。它交由进程管理器维持应用存活,并不替代容器编排或集群调度系统去完成多机调度与资源分配。
参见
参考资料
- PM2 [引用日期2026-10-29]
- PM2 (software) [引用日期2026-10-29]
- Dependents (1700) [引用日期2026-10-29]
- pm2 [引用日期2026-10-29]
- Cluster Mode [引用日期2026-10-29]
- JSON Micro-Service configuration with PM2 [引用日期2026-10-29]
- alven.co 上的网页 [引用日期2026-10-29]
- ewdn.com 上的网页 [引用日期2026-10-29]
- PM2 (software) [引用日期2026-10-29]
- CHANGELOG [引用日期2026-10-29]