You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法通过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执行脚本失败,最常见的两个原因就是缺少可执行权限和未指定脚本解释器:

操作步骤:

  1. 打开你的start.sh,在第一行添加shebang(告诉系统用什么解释器运行脚本):
#!/bin/bash
cd /srv/myapp && NODE_ENV=production yarn start
  1. 给脚本添加可执行权限:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:24:22