Linux EC2使用systemd运行Node应用时报错npm command not found问询
问题原因
- systemd运行服务时默认不会加载普通用户的shell配置文件(如
~/.bashrc、~/.bash_profile),仅使用系统默认的PATH环境变量,你手动在终端执行命令时会加载用户级配置,因此能正常找到npm命令。 - 你当前的systemd服务未指定运行用户,默认以root身份执行,而Node.js和npm大概率是在
ec2-user用户下安装的,root用户的环境变量中没有对应npm的执行路径。 - 你的启动脚本存在路径错误:
cd home/ec2-user/source/NodeApp/是相对路径写法,执行时会从服务的默认工作目录查找目标路径,大概率会切换目录失败,也会影响后续命令执行。
解决方案
步骤1:获取npm的绝对路径
登录ec2-user用户,在终端执行以下命令拿到npm的绝对路径,记下来后续替换使用:
which npm
示例输出为/home/ec2-user/.nvm/versions/node/v15.6.0/bin/npm,对应的npm所在目录就是/home/ec2-user/.nvm/versions/node/v15.6.0/bin。
步骤2:修改systemd服务配置
编辑NodeApp.service文件,补充用户、环境变量、工作目录配置:
[Unit] Description=Node app [Service] # 指定运行用户为安装了Node的ec2-user User=ec2-user Group=ec2-user # 替换为你上一步拿到的npm所在目录,加到PATH最前面 Environment="PATH=/home/ec2-user/.nvm/versions/node/v15.6.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin" # 指定应用工作目录,无需在脚本中额外cd WorkingDirectory=/home/ec2-user/source/NodeApp ExecStart=/home/ec2-user/source/NodeApp/start.sh # 可选配置:应用崩溃后自动重启 Restart=always RestartSec=5 [Install] WantedBy=multi-user.target
步骤3:修改启动脚本(可选,推荐配置)
为了进一步避免路径问题,可以直接在脚本中使用npm的绝对路径执行:
#!/bin/bash # 替换为你第一步拿到的npm绝对路径 /home/ec2-user/.nvm/versions/node/v15.6.0/bin/npm start
步骤4:生效配置并重启服务
依次执行以下命令让配置生效:
# 重新加载systemd配置 systemctl daemon-reload # 重启Node应用服务 systemctl restart NodeApp # 查看服务运行状态确认正常 systemctl status NodeApp
内容的提问来源于stack exchange,提问作者Christopher Fotos
相关产品推荐
相关产品推荐

