如何在Ubuntu 18.04服务器重启时自动运行PM2?
Ubuntu 18.04下PM2无法随服务器重启自动运行,但脚本中其他命令正常执行
我希望服务器重启时PM2能自动运行,但该功能无法实现,不过脚本中的mkdir命令可正常执行。服务器系统为Ubuntu 18.04。
相关配置文件
myscript.service
[Unit] Description=My Script After=network.target [Service] ExecStart=/usr/local/bin/myscript.sh Restart=always [Install] WantedBy=default.target
myscript.sh
#!/bin/bash # Wait for the system to fully initialize sleep 30 # Change to the node directory cd /var/www/html/node/sms-management-system /usr/bin/pm2 start app.js --name "SMS" -o ./sms.log -e ./sms.log --merge-logs /usr/bin/pm2 save cd /var/www/html/React/sms-management-system /usr/bin/pm2 start npm -- start --name "React-Sms" -o ./react_sms_O.log -e ./react_sms_E.log --merge-logs /usr/bin/pm2 save # Start the PM2 service /usr/bin/pm2 startup ubuntu # Change to the html directory cd /var/www/html/ mkdir ererere # Save the PM2 configuration again to include the new process /usr/bin/pm2 save
问题分析与解决方案
核心问题
你的配置存在3个关键问题导致PM2无法开机自启:
pm2 startup ubuntu是一次性初始化命令,重复在开机脚本中执行会生成无效/冲突的systemd配置- PM2的开机自启依赖自身生成的专属systemd服务,而非自定义脚本间接启动进程
- 脚本中PM2启动命令的参数顺序错误,且重复执行
pm2 save会干扰配置文件
步骤1:修复启动脚本
修改/usr/local/bin/myscript.sh,移除冗余命令并修正参数顺序:
#!/bin/bash # 等待系统与网络完全就绪 sleep 30 # 启动Node后端服务 cd /var/www/html/node/sms-management-system /usr/bin/pm2 start app.js --name "SMS" -o ./sms.log -e ./sms.log --merge-logs # 启动React前端服务(修正参数顺序:--name需放在npm之后、-- start之前) cd /var/www/html/React/sms-management-system /usr/bin/pm2 start npm --name "React-Sms" -- start -o ./react_sms_O.log -e ./react_sms_E.log --merge-logs # 保存当前PM2进程列表到配置文件 /usr/bin/pm2 save # 保留测试用mkdir命令 cd /var/www/html/ mkdir -p ererere
步骤2:正确配置PM2开机自启
- 手动执行一次PM2初始化命令,生成专属systemd服务(替换
your-user为实际运行PM2的用户名,root运行则去掉-u和--hp参数):sudo /usr/bin/pm2 startup ubuntu -u your-user --hp /home/your-user - 保存当前PM2进程配置:
sudo /usr/bin/pm2 save - 验证PM2服务状态:
确认服务处于sudo systemctl status pm2-your-useractive (running)状态
步骤3:调整自定义systemd服务(可选)
如果需要保留myscript.service,修改配置确保权限与依赖正确:
[Unit] Description=My Script After=network.target pm2-your-user.service [Service] User=your-user WorkingDirectory=/var/www/html ExecStart=/usr/local/bin/myscript.sh Restart=always [Install] WantedBy=multi-user.target
步骤4:重启验证
- 重载systemd配置:
sudo systemctl daemon-reload - 启用并启动自定义服务(若保留):
sudo systemctl enable --now myscript.service - 重启服务器后,检查PM2进程:
pm2 list
内容的提问来源于stack exchange,提问作者omkar
相关产品推荐
相关产品推荐

