linux下pm2开机自启必须先pm2 save再pm2 startup,因startup仅注册systemd服务并输出systemctl enable命令(需手动执行),而save才将当前进程列表序列化写入dump.pm2供systemd恢复。

Linux 下 PM2 开机自启必须分两步:先 pm2 save,再 pm2 startup;漏掉任意一步,重启后服务全丢——因为 pm2 startup 注册的是 systemd 服务,但它不存进程列表,只负责“拉起 PM2 进程”,而真正决定“拉起哪些应用”的是 dump.pm2 文件,这个文件只由 pm2 save 生成。
为什么 pm2 save 不可跳过?
pm2 save 不是“备份”,而是把当前 pm2 list 里所有 running / stopped 状态的进程,序列化写入 dump.pm2 文件(默认路径:/root/.pm2/dump.pm2 或 /home/xxx/.pm2/dump.pm2)。systemd 启动 pm2-root 服务时,会读这个文件恢复应用。
- 执行后终端会明确提示保存位置,例如:
[PM2] Successfully saved in /root/.pm2/dump.pm2 -
pm2 stop app-name不影响 dump 文件,只有pm2 delete app-name或手动删dump.pm2才真正清除记录 - 如果中途改过环境变量(如
NODE_ENV),记得重新pm2 start再save,否则 dump 里存的是旧配置
pm2 startup 之后那行 systemctl enable 命令必须手动运行
pm2 startup 本身只是生成 systemd 服务单元文件(如 pm2-root.service),并输出一行类似 sudo systemctl enable pm2-root 的命令——它不会自动执行。很多人卡在这一步,以为执行完 pm2 startup 就结束了。
- 必须复制粘贴并执行它,否则
systemctl is-enabled pm2-root返回disabled - 验证是否注册成功:
systemctl status pm2-root应显示Active: active (running) - 如果报错
Unit file pm2-root.service does not exist,说明pm2 startup执行失败,常见于权限不足或用户身份混乱(比如用sudo pm2 start启的服务,却用普通用户跑pm2 startup)
环境变量丢失导致应用启动失败
systemd 服务默认加载系统级环境,不读 ~/.bashrc 或 ~/.profile,所以你在 shell 里设的 PORT、NODE_ENV 在开机自启时全失效。
- 最稳妥的方式是在
ecosystem.config.js中显式声明:env: { NODE_ENV: 'production', PORT: 3000 } - 或者启动时加参数:
pm2 start app.js --env production,再pm2 save - 不推荐改 systemd service 文件加
Environment=,容易被pm2 startup覆盖
最容易被忽略的是用户上下文一致性:谁执行 pm2 save,dump 文件就落在谁的 ~/.pm2/ 下;而 pm2 startup 注册的服务,默认以同一用户身份运行。如果你用 sudo pm2 start,但没用 sudo pm2 save,systemd 就找不到 dump 文件——此时 pm2 list 看得到进程,但重启后一个都不在。











