无法通过systemd运行Node应用的问题排查与解决请求
问题诊断与修复方案
从你贴的错误日志来看,核心问题是code=exited, status=203/EXEC——这个systemd错误码直白地告诉你:它没法执行你指定的启动脚本。结合你的配置细节,咱们一步步排查解决:
1. 先揪出明显的用户名/路径矛盾
你在myapp.service里配置了User=john,但错误日志里却显示systemd尝试执行/home/bob/start.sh,这明显是个笔误!请先修正:
- 要么把
ExecStart改成正确的/home/john/start.sh(如果你的运行用户确实是john) - 要么把
User字段改成bob(如果实际运行用户是bob)
2. 给start.sh补上两个关键要素
systemd执行脚本失败,最常见的两个原因就是缺少可执行权限和未指定脚本解释器:
操作步骤:
- 打开你的
start.sh,在第一行添加shebang(告诉系统用什么解释器运行脚本):
#!/bin/bash cd /srv/myapp && NODE_ENV=production yarn start
- 给脚本添加可执行权限:
chmod +x /home/john/start.sh
3. 解决systemd环境变量找不到yarn的问题
当systemd以指定用户身份运行服务时,它的环境变量和你登录shell时的不一样,很可能找不到yarn的位置。咱们用绝对路径彻底解决这个问题:
先获取yarn的绝对路径:
在你的shell中执行:
which yarn
假设输出是/usr/local/bin/yarn,就把start.sh里的yarn替换成这个绝对路径:
#!/bin/bash cd /srv/myapp && NODE_ENV=production /usr/local/bin/yarn start
4. (可选)直接用systemd配置替代start.sh,更可靠
其实没必要额外写start.sh,直接把配置整合到service文件里,减少一层依赖,也更易维护:
[Unit] Description=Myapp After=network.target # 确保网络就绪后再启动应用 [Service] Type=simple User=john WorkingDirectory=/srv/myapp # 直接指定工作目录,无需cd命令 Environment=NODE_ENV=production # 直接设置环境变量 ExecStart=/usr/local/bin/yarn start # 使用yarn的绝对路径 Restart=on-failure RestartSec=5 # 失败后间隔5秒再重启,避免频繁刷屏 [Install] WantedBy=multi-user.target
最后验证修改
改完配置后,记得重新加载systemd,再启动服务:
sudo systemctl daemon-reload sudo systemctl start myapp
然后查看服务状态确认是否正常:
sudo systemctl status myapp
如果还是有问题,用journalctl查看更详细的实时日志:
journalctl -u myapp -f
内容的提问来源于stack exchange,提问作者Babr
相关产品推荐
相关产品推荐

