PM2 进程管理速查表 - Node.js 进程管理命令大全
Node 服务若只是前台跑或直接 node app.js,进程一挂、内存一涨就全靠人肉盯。PM2 把守护、崩溃重启、集群、日志与开机自启串成一个闭环。本表按启动运行、日志、监控、集群、开机自启、ecosystem.config.js 分组,把部署时最常用的命令与关键参数放在一起,并标注 reload 与 restart 的差别、以及 save + startup 搭配实现重启自愈这类运维要点。读完能独立为 Node 服务配好守护、扩容与自愈。
典型使用场景
上线 Node 服务前,用 -i max 集群模式按 CPU 核数多开进程,并把参数收敛进 ecosystem.config.js 统一管理;服务崩溃或内存泄漏时,先 pm2 monit 看趋势,再配置 max_memory_restart 让超限进程自动重启兜底;需要滚动发布不中断在线用户时,用 reload 逐个重启实现零停机,尤其适合有状态或长连接服务;服务器重启后要自动拉起全部服务,组合 pm2 save 与 pm2 startup 完成开机自启;日常排查先 pm2 list 定位非 online 的进程,再 pm2 logs 看报错。
启动与停止 Start & Stop 12
pm2 start app.jspm2 start app.js --name "api"pm2 start app.js -i maxpm2 start app.js -i 4pm2 start ecosystem.config.jspm2 stop allpm2 stop apipm2 restart apipm2 reload apipm2 delete apipm2 start app.js --watchpm2 kill日志管理 Logs 5
pm2 logspm2 logs api --lines 100pm2 logs api --errpm2 flushpm2 install pm2-logrotate监控与状态 Monitor 6
pm2 listpm2 show apipm2 monitpm2 statuspm2 describe apipm2 jlist开机自启 Startup 4
pm2 startuppm2 savepm2 resurrectpm2 unstartup集群与扩展 Cluster & Scale 5
pm2 scale api +2pm2 scale api 8pm2 reset apipm2 serve ./dist 8080pm2 deploy ecosystem.config.js production生态配置 ecosystem.config.js 6
module.exports = { apps: [{ name: "api", script: "app.js", instances: "max", exec_mode: "cluster" }] }env: { NODE_ENV: "production", PORT: 3000 }max_memory_restart: "1G"error_file: "./logs/err.log", out_file: "./logs/out.log"watch: true, ignore_watch: ["node_modules", "logs"]pm2 start ecosystem.config.js --env production参数矩阵
| 参数 | 作用 | 示例 |
|---|---|---|
--name | 给进程起一个稳定名字,后续 stop / restart / logs 都靠它定位 | pm2 start app.js --name "api" |
-i max | 按 CPU 核数开满实例,是生产环境提高吞吐的默认起点 | pm2 start app.js -i max |
-i <N> | 指定实例数,在核数与内存配比需要精确控制时替代 -i max | pm2 start app.js -i 4 |
pm2 start ecosystem.config.js | 用配置文件启动,把所有参数收敛到一处而不是散在命令行历史里 | pm2 start ecosystem.config.js |
--env production | 按环境段读取配置里的 env_production,让同一份配置区分环境 | pm2 start ecosystem.config.js --env production |
pm2 reload | 逐个重启实例,集群模式下实现不断连接的重载 | pm2 reload api |
pm2 restart | 直接重启指定进程重载代码,行为在两种执行模式下都一致 | pm2 restart api |
pm2 delete | 从进程列表移除,之后不再被守护与自启恢复 | pm2 delete api |
--watch | 监听文件变化自动重启,开发期省去手动重启 | pm2 start app.js --watch |
watch + ignore_watch | 开启自动重启同时排除依赖与日志目录,避免无谓的震荡重启 | watch: true, ignore_watch: ["node_modules", "logs"] |
pm2 logs --lines | 只看最近若干行,避免历史日志刷屏淹没刚出现的报错 | pm2 logs api --lines 100 |
pm2 logs --err | 只输出错误流,堆栈与异常信息集中呈现 | pm2 logs api --err |
pm2 flush | 清空已落盘的日志文件,先释放磁盘再谈别的 | pm2 flush |
pm2 install pm2-logrotate | 安装日志轮转模块,防止日志无限增长把磁盘写满 | pm2 install pm2-logrotate |
pm2 show / describe | 核对进程详情:启动命令、重启次数、内存、uptime、日志路径与启动环境 | pm2 describe api |
pm2 monit | 实时面板观察 CPU 与内存走势,判断某个进程是否在缓慢泄漏 | pm2 monit |
pm2 jlist | 以 JSON 输出进程列表,便于脚本稳定解析而不是解析终端文本 | pm2 jlist |
pm2 reset | 清零重启计数,让重启次数重新反映本次部署后的情况 | pm2 reset api |
pm2 scale <±N|name> | 在线增减实例,不重启整个应用即可调整容量 | pm2 scale api +2 |
pm2 save / resurrect | 保存当前进程列表并在需要时原样恢复,是自启链路的两端 | pm2 resurrect |
pm2 startup / unstartup | 生成或移除开机自启脚本,需要按提示真正执行输出的那行命令 | pm2 startup |
max_memory_restart | 给单进程内存设上限,越限自动重启,是泄漏兜底而非排查手段 | max_memory_restart: "1G" |
instances + exec_mode | 在配置文件里声明实例数与 cluster 执行模式,决定是否具备零停机重载能力 | module.exports = { apps: [{ name: "api", script: "app.js", instances: "max", exec_mode: "cluster" }] } |
error_file / out_file | 指定日志落盘路径,使日志位置可预期、可被采集 | error_file: "./logs/err.log", out_file: "./logs/out.log" |
pm2 serve | 把静态目录当服务发布,用于前端产物这类无需 Node 逻辑的交付 | pm2 serve ./dist 8080 |
易错点与避坑指南
现象机器重启后进程全没了,pm2 list 是空的。
原因pm2 startup 只是打印一段需要执行的命令,没有以对应用户实际跑过那行,自启单元就没被安装;pm2 save 保存的列表也需要它才能被读回。
处置先 pm2 save 保存当前列表,再执行 pm2 startup 输出的那行命令,之后可用 pm2 resurrect 验证恢复是否成功。
现象配置改了生效的却是旧值,重启多少次都一样。
原因进程仍按启动时的参数在跑,配置文件里新加的键从未被读入;也可能是启动时带了 --env 读的是另一段配置。
处置用 pm2 describe api 核对实际的启动命令与启动环境,确认后用 pm2 start ecosystem.config.js --env production 重新按配置拉起。
现象进程跑了一段时间后自己重启,重启计数一路往上涨。
原因内存超过 max_memory_restart 设的上限,PM2 按配置把它重启了;这是兜底生效,不是进程自己崩的。
处置用 pm2 show api 看重启次数与内存占用确认这一判断,再排查代码里的累积对象;短期可用 pm2 reset api 清零计数以免干扰观察。
现象本地明明在监听,服务却间歇性不通。
原因以 -i 开多实例后每个实例都试图绑定同一端口,先起来的占住端口,后起来的因冲突进入反复重启,列表里仍显示进程存在。
处置确认进程数与端口的关系,需要多实例时改用 cluster 模式(配置里的 exec_mode: "cluster")并核对 pm2 list 中的实例数。
现象磁盘被日志占满,服务异常退出。
原因默认日志文件无限增长,没有轮转也没有清理,磁盘满之后进程写日志失败随之异常。
处置先 pm2 flush 清空现有日志腾出空间,再 pm2 install pm2-logrotate 安装轮转模块;需要固定位置时在配置里写清 error_file 与 out_file。
现象保存的进程列表恢复出来的是旧代码位置。
原因pm2 save 记录的是当时的启动命令与工作目录,之后代码换了目录或版本,resurrect 仍按旧记录拉起。
处置恢复后用 pm2 list 核对路径,确认不符就用 pm2 delete api 移除旧条目,再从当前配置重新启动。
现象自动重启的频率高得离谱,进程根本起不来。
原因watch 监听范围包含依赖与日志目录,运行时写日志或写缓存本身就触发文件变化,于是形成「启动-写文件-再重启」的循环。
处置在配置里保留 watch: true 并显式写 ignore_watch: ["node_modules", "logs"],让触发点只落在真正改动的源码上。
现象终端里 pm2 面板刚打开就退出,什么也没看到。
原因实时面板靠刷新屏幕持续绘制,在非交互环境或输出被重定向时无法正常渲染。
处置改用一次性输出核对状态:pm2 list 看整体,pm2 show api 看单个进程的内存与重启次数。
现象重启次数被历史失败污染,看不出本次部署是否稳定。
原因重启计数在进程生命周期内一直累加,早期那次崩溃也留在里面,读数分不清是历史问题还是当前问题。
处置部署完成后用 pm2 reset api 清零计数,再观察 pm2 monit 的走势判断当前是否还在增长。
排障路径
1先列出全部进程,定位状态不是 online 的那一项
pm2 list逐行看 status 列;出现 errored 或 exited 的行就是下一步要查的对象,其余行可以先放一边。
2查看单个进程的详情,确认启动参数与重启次数
pm2 show api重点看 restart count、memory 与 script path:次数持续增长指向崩溃或超限,路径不符说明启动用的不是当前代码。
3只取最近若干行日志,缩小到刚出现的报错
pm2 logs api --lines 100输出末尾即为最新内容;若这 100 行仍无异常,再换更长的窗口。
4只看错误流,把堆栈集中到一处
pm2 logs api --err正文之外的堆栈跟随 stderr 输出,这条命令能把它们单独拎出来。
5核对启动时的配置是否真的生效
pm2 describe api对照输出里的 script path、exec mode 与 env,确认与配置文件一致。
6观察内存走势,判断是否在缓慢泄漏
pm2 monit内存一栏持续单向上涨且从不回落,就是泄漏的典型形态;面板退出即停止采样。
7清空已落盘的日志,先把磁盘腾出来
pm2 flush命令无输出即成功;注意历史日志同时被清掉,需要留证应先备份。
8部署后清零重启计数,重新建立观察基准
pm2 reset api计数归零后再看 pm2 list,后续任何增长都能确定来自本次部署。
命令示例
按 CPU 核数集群启动并确认运行
pm2 start app.js -i max
pm2 list-i max 按 CPU 核数启动;pm2 list 看 status 是否 online、instances 是否等于核数,restart:0 表示未发生过崩溃重启。
输出
│ api │ online │ 8 │ 4.2MB │ restart:0 │
零停机滚动重载配置变更
pm2 reload api集群模式下 reload 会逐个重启进程实现零停机;若应用为 fork(单进程)模式,reload 与 restart 效果相同、无法零停机。
配置日志轮转防止磁盘写满
pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 10M日志无限增长会撑爆磁盘;安装后调整 max_size(默认 10M)与默认每天轮转,旧日志按保留策略清除。
输出
Modifying value of setting [pm2-logrotate:max_size] with value 10M
常见坑与注意事项
- pm2 kill 会连守护进程一起退出并清空进程,生产环境不要用 kill 来"重启 PM2",正确做法是 restart 具体应用或重启服务器。
- pm2 startup 只是生成一段要执行的命令,必须按提示以 sudo/root 实际运行那行输出一次,开机自启才会真正生效,很多人漏了这一步。
- reload 的零停机只在 cluster 模式下成立;fork 模式下 reload 等价于 restart,会中断连接。
- --watch 会把 node_modules、日志等目录的变化也当成重启触发点,务必配 ignore_watch 排除,否则会造成无谓震荡重启。
- pm2 monit 是实时监听面板,退出即停止采样;要持久观察内存/重启趋势,应配合监控告警或采集工具,而不是人肉盯终端。
提示
- reload 比 restart 更平滑,集群模式下逐个重启实现零停机,单进程模式 reload 等同于 restart。
- pm2 save + pm2 startup 组合实现开机自启,服务器重启后自动恢复所有进程。
- 内存泄漏排查:pm2 monit 观察内存趋势,配置 max_memory_restart 自动重启兜底。
常见问题
pm2 的 reload 和 restart 有什么区别?
restart 是杀死进程再拉起,会短暂断服务;reload 在 cluster 模式下逐个重载 worker 实现零停机更新,代码变了不断连接。想平滑发布用 pm2 reload app;若服务不是多实例或只需清状态,用 restart 即可。
pm2 几次重启后提示端口被占用怎么办?
通常是旧进程没退干净或端口被系统、其它进程占用。先 pm2 delete app 彻底删掉旧的,再查端口占用(Linux 用 ss -tlnp)并杀掉对应进程,确认 PORT 无冲突后重新 pm2 start。也可能是崩溃被反复拉起,先看 pm2 logs 排查真正异常。
pm2 需要开机自启怎么配置?
先用 pm2 start 启动要自启的应用并 pm2 save 保存列表,然后执行 pm2 startup 并按它输出运行对应的 init 命令(会生成 systemd 或 sysv 启动脚本)。这样开机时 PM2 会自动加载已 save 的应用,实现重启自愈。
pm2 挂掉后会自动重启吗,怎么限制内存用量?
普通崩溃默认会自动重启一次;想长时间守护可设 max_restarts。为避免内存泄漏撑爆机器,在 pm2 start app --max-memory-restart 1G 或 ecosystem.config.js 的 max_memory_restart 设阈值,超过即自动重启。长驻压力大时可配合日志轮转一起使用。
pm2 save 有什么作用,不加会怎样?
pm2 save 把当前运行的进程列表写入 dump 文件,配合 pm2 startup 才能实现开机自启,也用于 pm2 resurrect 手动恢复。不加 save,机器重启或换新机后 PM2 会丢失这些进程的管理状态,需要手动重新 start 一遍。
由 巧匠 维护
公开更新于 2026年7月21日,内容持续校对官方文档。