Ubuntu 18.04中pm2-carles.service启动失败的技术求助
我之前也碰到过一模一样的PM2 systemd服务启动报错,结合你给出的操作步骤和报错信息,给你几个实用的排查和解决方向:
1. 检查systemd服务文件的Type配置
首先,先找到自动生成的pm2-carles.service文件,路径一般是/etc/systemd/system/pm2-carles.service。用cat命令查看内容:
cat /etc/systemd/system/pm2-carles.service
重点看Type字段——如果它设置成了simple,那大概率是问题所在。因为PM2启动后台进程属于forking模式,需要把Type改成forking。
修改完之后,别忘了重新加载systemd配置再启动服务:
sudo systemctl daemon-reload sudo systemctl start pm2-carles
2. 确认用户权限和环境变量
你指定了用carles用户运行PM2,要确保这个用户对PM2的配置目录/home/carles/.pm2/有完整的读写权限:
ls -ld /home/carles/.pm2/
如果所有者不是carles:carles,用chown命令修正:
sudo chown -R carles:carles /home/carles/.pm2/
另外,检查服务文件里的Environment字段,确保PATH包含了node和PM2的路径。如果PATH不完整,PM2可能找不到依赖命令,导致服务启动异常。可以把PATH补全成这样:
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/node_modules/pm2/bin"
3. 查看更详细的日志细节
虽然你说journalctl -xe显示pm2 resurrect成功,但不妨看看更针对性的日志:
- 实时跟踪PM2服务的systemd日志:
journalctl -u pm2-carles.service -f
- 查看PM2自身的应用日志:
pm2 logs
有时候可能是某个应用启动失败,间接导致systemd判定服务启动失败,用pm2 list确认你的hello.js是否在列表里且状态正常。
4. 彻底重新生成PM2服务文件
如果上面的方法都没用,可以试试彻底清除现有服务,重新生成:
# 停止并禁用现有服务 sudo systemctl stop pm2-carles.service sudo systemctl disable pm2-carles.service # 删除服务文件 sudo rm /etc/systemd/system/pm2-carles.service # 取消PM2的启动配置 pm2 unstartup systemd # 重新生成启动脚本 pm2 startup systemd -u carles --hp /home/carles # 保存当前PM2应用列表 sudo pm2 save # 启用并启动服务 sudo systemctl enable pm2-carles.service sudo systemctl start pm2-carles.service
5. 检查AppArmor限制
Ubuntu默认启用AppArmor,有时候它会限制PM2的进程操作。可以临时关闭测试:
sudo systemctl stop apparmor sudo systemctl disable apparmor
如果服务能正常启动了,再去配置AppArmor允许PM2的相关操作就行。
内容的提问来源于stack exchange,提问作者Carlos del Río Francés

