PM2 进程管理速查表 - Node.js 进程管理命令大全

Node 服务若只是前台跑或直接 node app.js,进程一挂、内存一涨就全靠人肉盯。PM2 把守护、崩溃重启、集群、日志与开机自启串成一个闭环。本表按启动运行、日志、监控、集群、开机自启、ecosystem.config.js 分组,把部署时最常用的命令与关键参数放在一起,并标注 reload 与 restart 的差别、以及 save + startup 搭配实现重启自愈这类运维要点。读完能独立为 Node 服务配好守护、扩容与自愈。

编程语言·共 38 条命令·最后更新 2026-07-21
pm2node进程管理集群

典型使用场景

上线 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.js
启动应用
pm2 start app.js --name "api"
启动并命名进程
pm2 start app.js -i max
集群模式,按 CPU 核数启动
pm2 start app.js -i 4
集群模式,指定 4 个进程
pm2 start ecosystem.config.js
用配置文件启动(推荐)
pm2 stop all
停止所有进程
pm2 stop api
停止指定进程
pm2 restart api
重启进程(重载代码)
pm2 reload api
零停机重载(集群模式推荐)
pm2 delete api
从进程列表删除
pm2 start app.js --watch
监听文件变化自动重启
pm2 kill
杀掉所有进程并停止 PM2 守护

日志管理 Logs 5

pm2 logs
实时查看所有日志
pm2 logs api --lines 100
查看指定进程最近 100 行,日志刷屏时收窄到最近 N 行便于定位
pm2 logs api --err
只看错误日志,正文之外的堆栈跟随 stderr 一并输出
pm2 flush
清空所有日志文件,配合 pm2 start --log 指定路径后释放磁盘
pm2 install pm2-logrotate
安装日志轮转模块,防止日志无限增长导致磁盘写满

监控与状态 Monitor 6

pm2 list
列出所有进程
pm2 show api
查看进程详情(启动命令、重启次数、内存、uptime、日志路径、启动环境)
pm2 monit
终端监控面板(CPU/内存),现场观察某进程是否在缓慢泄漏
pm2 status
查看进程状态,配合 --watch 时确认是否因文件变化被反复重启
pm2 describe api
查看进程详细描述信息,常用于核对启动时的配置参数是否生效
pm2 jlist
JSON 格式输出进程列表(适合脚本)

开机自启 Startup 4

pm2 startup
生成开机自启脚本,按提示执行输出的命令
pm2 save
保存当前进程列表,开机自启时恢复
pm2 resurrect
手动恢复保存的进程列表
pm2 unstartup
移除开机自启

集群与扩展 Cluster & Scale 5

pm2 scale api +2
扩容 2 个进程
pm2 scale api 8
指定进程总数为 8
pm2 reset api
重置进程重启计数
pm2 serve ./dist 8080
静态文件目录服务
pm2 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"
内存超 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
指定环境启动(读取 env_production)

参数矩阵

参数作用示例
--name给进程起一个稳定名字,后续 stop / restart / logs 都靠它定位pm2 start app.js --name "api"
-i max按 CPU 核数开满实例,是生产环境提高吞吐的默认起点pm2 start app.js -i max
-i <N>指定实例数,在核数与内存配比需要精确控制时替代 -i maxpm2 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. 1先列出全部进程,定位状态不是 online 的那一项

    pm2 list

    逐行看 status 列;出现 errored 或 exited 的行就是下一步要查的对象,其余行可以先放一边。

  2. 2查看单个进程的详情,确认启动参数与重启次数

    pm2 show api

    重点看 restart count、memory 与 script path:次数持续增长指向崩溃或超限,路径不符说明启动用的不是当前代码。

  3. 3只取最近若干行日志,缩小到刚出现的报错

    pm2 logs api --lines 100

    输出末尾即为最新内容;若这 100 行仍无异常,再换更长的窗口。

  4. 4只看错误流,把堆栈集中到一处

    pm2 logs api --err

    正文之外的堆栈跟随 stderr 输出,这条命令能把它们单独拎出来。

  5. 5核对启动时的配置是否真的生效

    pm2 describe api

    对照输出里的 script path、exec mode 与 env,确认与配置文件一致。

  6. 6观察内存走势,判断是否在缓慢泄漏

    pm2 monit

    内存一栏持续单向上涨且从不回落,就是泄漏的典型形态;面板退出即停止采样。

  7. 7清空已落盘的日志,先把磁盘腾出来

    pm2 flush

    命令无输出即成功;注意历史日志同时被清掉,需要留证应先备份。

  8. 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日,内容持续校对官方文档。

联系我们

命令或描述有误?提交反馈、商务合作或产品建议都可发送邮件给我们。

联系我们