pm2是Linux下保障Node.js长期稳定运行的核心工具,需正确安装、启动并持久化以应对终端关闭、崩溃和重启;常见问题包括命令未找到、启动失败、开机自启失效、日志不可见及重启策略误用。

pm2 是 Linux 上让 Node.js 项目长期稳定运行最直接有效的手段。只要正确安装、启动并持久化,它就能扛住终端关闭、进程崩溃、系统重启三重考验——但每一步都有容易卡住的点,尤其在非标准环境里。
pm2 命令找不到?先确认 Node.js 和 PATH 是否就位
执行 pm2 --version 报 -bash: pm2: command not found,不是 pm2 没装,而是 shell 找不到它的可执行文件。常见原因有三个:
- Node.js 本身没激活(比如用
nvm管理但没nvm use),导致npm install -g pm2实际没生效;验证方式:which node和which npm都应有输出 - 全局安装的
pm2不在$PATH中(尤其自编译 Node 或手动解压安装时);查安装路径:npm config get prefix,然后看bin/下是否有pm2 - 权限问题:用
sudo npm install -g pm2安装后,普通用户可能仍无法调用;更稳妥做法是改 npm 全局目录权限,或用nvm管理 Node 版本(避免 sudo)
启动时进程立刻退出?重点检查 script 路径和执行权限
pm2 start app.js 后 pm2 status 显示 errored 或根本不出现在列表里,90% 是路径或权限问题:
- 务必用绝对路径启动,比如
pm2 start /home/user/myapp/app.js;相对路径在不同工作目录下会失效 - 确认
app.js文件有可读权限:chmod +r app.js;若用npm start启动,还要确保package.json存在且scripts.start字段有效(比如不是空字符串或拼写错误) - 如果用
pm2 start npm --name "myapp" -- start,注意末尾的start是package.json里的脚本名,不是固定写法;换成dev或prod也必须对应实际定义
如何让项目开机自启?别只跑 pm2 startup
pm2 startup 只生成 systemd(或 init.d)服务脚本,但不会自动启用或保存当前进程列表:
- 执行
pm2 startup systemd(CentOS/RHEL 7+ 或 Ubuntu 16.04+ 推荐)后,必须紧接着运行pm2 save,否则重启后pm2 list是空的 - 如果系统是较老版本(如 CentOS 6),
pm2 startup可能输出init.d脚本路径,需手动执行生成的命令(类似sudo su -c "env PATH=$PATH:/usr/bin pm2 startup ...") - 验证是否生效:重启服务器后,直接
pm2 status,状态应为online;若仍为空,检查journalctl -u pm2-root(systemd)或/var/log/pm2/pm2.log
日志看不到、查不到?默认不输出到终端
pm2 默认把 stdout/stderr 重定向到自己的日志系统,不是直接打屏。不主动查,就以为“没输出”:
- 实时看某应用日志:
pm2 logs "myapp";加--err只看错误,--out只看标准输出 - 日志默认存放在
~/.pm2/logs/下,按应用名分myapp-out.log和myapp-error.log;若配置了error_file或out_file,则以配置路径为准 - 日志体积大时会自动轮转,但不会自动清理;定期
pm2 flush清空历史,或用pm2 set pm2:log_date_format "YYYY-MM-DD"加时间戳便于归档
真正容易被忽略的是:pm2 restart 和 pm2 reload 的语义差异。前者是 stop + start,会丢连接;后者才是零停机重载,但前提是你的应用用了 cluster 模式(-i max)且代码支持热更新逻辑。生产环境别图省事全用 restart。


















