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

AWS Amazon Linux 2上systemd服务启动失败排查求助

Node.js应用systemd服务启动失败(status=203/EXEC)排查思路

问题背景

在Amazon Linux 2的AWS EC2实例上部署Node.js应用,手动执行server.js完全正常:

[ec2-user@ip-*********** portfolio_v3]$ nvm use 16
Now using node v16.19.1

[ec2-user@ip-*********** portfolio_v3]$ MAIL_JET_API_KEY_PRIVATE="..." NYT_API_KEY="..." node server.js
...

创建systemd服务配置文件/etc/systemd/system/portfolio-v3.service:

[Unit]
Description=portfolio-v3
After=multi-user.target

[Service]
Environment=MJ_API_KEY_PRIVATE=1234567890
Environment=NYT_API_KEY=1234567890
ExecStart=/home/.nvm/versions/node/v16.19.1/bin/node /home/ec2-user/portfolio-v3/server.js
Restart=always
RestartSec=10
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=portfolio-v3
User=ec2-user

[Install]
WantedBy=multi-user.target

执行以下命令后服务启动失败:

sudo chmod 644 /etc/systemd/system/portfolio-v3.service
sudo systemctl daemon-reload
sudo systemctl enable portfolio-v3.service
sudo systemctl start portfolio-v3.service

服务状态显示:

$ sudo systemctl status portfolio-v3.service
● portfolio-v3.service - portfolio-v3
   Loaded: loaded (/etc/systemd/system/portfolio-v3.service; enabled; vendor preset: disabled)
   Active: activating (auto-restart) (Result: exit-code) since Thu 2023-03-16 04:55:42 UTC; 8s ago
  Process: 7067 ExecStart=/home/.nvm/versions/node/v16.19.1/bin/node /home/ec2-user/portfolio-v3/server.js (code=exited, status=203/EXEC)
 Main PID: 7067 (code=exited, status=203/EXEC)

Mar 16 04:55:42 ip-172-31-18-127.us-west-2.compute.internal systemd[1]: portfolio-v3.service: main process exited, code=exited, status=203/EXEC
Mar 16 04:55:42 ip-172-31-18-127.us-west-2.compute.internal systemd[1]: Unit portfolio-v3.service entered failed state.
Mar 16 04:55:42 ip-172-31-18-127.us-west-2.compute.internal systemd[1]: portfolio-v3.service failed.

排查思路

  • 检查Node路径的存在性与权限
    status=203/EXEC核心原因是systemd无法执行指定二进制文件,先确认Node路径有效性:

    1. 切换到ec2-user,执行ls -l /home/.nvm/versions/node/v16.19.1/bin/node,确认文件存在且ec2-user拥有执行权限(权限位含x)
    2. 若路径错误,通过nvm use 16 && which node获取正确路径,修正ExecStart中的Node路径
  • 补充工作目录配置
    手动执行时在项目目录下运行,systemd默认工作目录为根目录,可能导致应用找不到依赖/配置:
    在[Service]段添加WorkingDirectory=/home/ec2-user/portfolio-v3,确保应用在正确目录启动

  • 对齐环境变量名称
    配置文件中环境变量名为MJ_API_KEY_PRIVATE,但手动执行时用的是MAIL_JET_API_KEY_PRIVATE,变量名不匹配会导致应用启动失败,修正Environment行的变量名与手动执行一致

  • 查看详细日志定位错误
    仅靠status信息不足以排查,执行sudo journalctl -u portfolio-v3.service -f实时查看服务日志,获取具体启动报错;同时检查应用自身日志,确认是否存在依赖缺失、端口占用等问题

  • 直接测试ExecStart命令
    切换到ec2-user,直接执行ExecStart中的完整命令:

    su - ec2-user
    /home/.nvm/versions/node/v16.19.1/bin/node /home/ec2-user/portfolio-v3/server.js
    

    若执行失败,根据报错信息修复(如依赖未安装、文件权限不足等)

  • 处理nvm环境加载问题
    nvm是用户级环境变量,systemd启动服务时不会加载用户bash配置(如.bashrc/.bash_profile),可通过两种方式解决:

    1. 改用全局安装的Node(sudo yum install nodejs)
    2. 修改ExecStart先加载nvm环境再启动应用:
      ExecStart=/bin/bash -c 'source /home/ec2-user/.nvm/nvm.sh && nvm use 16 && node /home/ec2-user/portfolio-v3/server.js'
      

内容的提问来源于stack exchange,提问作者Aaron Parisi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 11:52:48