🔍 为什么会报错?

核心原因在于 环境隔离。NVM(Node Version Manager)是通过修改 PATH 环境变量来工作的,这些变量仅在你的 交互式 Shell(如 Bash/Zsh) 中生效。

Systemd 是一个独立的系统守护进程,它启动时:

  1. 找不到配置文件:默认不会去 NVM 路径下搜索 .service 文件。
  2. 找不到命令:Systemd 的运行环境非常纯净,它不知道 nodeopenclaw 被安装在 NVM 的深层目录里。

🛠️ 解决方案:三步手动修复

通过手动创建服务文件并硬编码(Hardcode) NVM 路径,可以完美解决路径丢失问题。

第一步:创建 Systemd 用户目录

首先确保用户级的服务目录存在:

mkdir -p ~/.config/systemd/user/

第二步:写入服务配置

直接复制并运行以下整段命令。

注意:下方的路径已根据你的环境(v24.14.0)预设,如果你切换了 Node 版本,请手动更新版本号。

cat <<EOF > ~/.config/systemd/user/openclaw-gateway.service
[Unit]
Description=OpenClaw Gateway Service
After=network.target

[Service]
Type=simple
# 明确指向 NVM 路径下的 openclaw 可执行文件
ExecStart=/home/$(whoami)/.nvm/versions/node/v24.14.0/bin/openclaw gateway
Restart=always

# 注入关键的 NVM 环境变量,确保 Node 能找到依赖库
Environment="PATH=/home/$(whoami)/.nvm/versions/node/v24.14.0/bin:/usr/local/bin:/usr/bin:/bin"
Environment="NODE_ENV=production"

[Install]
WantedBy=default.target
EOF

第三步:激活服务并让系统识别

运行以下命令,让 Systemd 感知并接管该服务:

# 1. 重新加载 Systemd 配置
systemctl --user daemon-reload

# 2. 启用服务(设置开机自启,并让 is-enabled 返回有效值)
systemctl --user enable openclaw-gateway.service

# 3. 立即启动服务
systemctl --user start openclaw-gateway.service


✅ 结果验证

现在运行以下命令检查状态:

systemctl --user is-enabled openclaw-gateway.service

预期输出: enabled

查看运行日志(确认没有路径报错):

journalctl --user -u openclaw-gateway.service -f


💡 小贴士

如果你未来更新了 Node.js 版本(例如升级到 v26.x.x),记得重新回到第二步修改配置文件中的路径,并再次执行 daemon-reload