Skip to content

[社区] Gateway 作为系统服务启动失败:环境变量未传递给服务进程

问题

openclaw gateway start 手动在终端执行正常,但通过 systemd/LaunchAgent/PM2 等服务方式启动时 Gateway 失败,常见症状包括:

  • API key 认证失败(401/403)
  • 无法找到配置文件
  • Gateway 立即退出但无明显错误日志

根本原因:环境变量(如 ANTHROPIC_API_KEYOPENAI_API_KEYOPENCLAW_STATE_DIR 等)存在于用户的 shell 会话中,但未被传递给系统服务进程。

解决方案

方案一:在 systemd unit 文件中引用环境变量文件(推荐,Linux)

ini
[Service]
User=openclaw
WorkingDirectory=/home/openclaw
EnvironmentFile=/home/openclaw/.openclaw/.env
ExecStart=/usr/bin/openclaw gateway start
Restart=on-failure

.env 文件内容:

bash
ANTHROPIC_API_KEY=sk-ant-...
OPENAI_API_KEY=sk-...
OPENCLAW_STATE_DIR=/home/openclaw/.openclaw

方案二:通过 openclaw config set 写入配置文件(而非依赖环境变量)

bash
# 将 API key 写入配置,避免依赖 shell 环境
openclaw config set models.providers.anthropic.apiKey "sk-ant-..."
openclaw config set models.providers.openai.apiKey "sk-..."

这样 API key 存储在配置文件中,服务进程无需继承 shell 环境变量。

方案三:macOS LaunchAgent 传递环境变量

~/Library/LaunchAgents/openclaw.plist 中添加 EnvironmentVariables 节:

xml
<key>EnvironmentVariables</key>
<dict>
  <key>ANTHROPIC_API_KEY</key>
  <string>sk-ant-...</string>
  <key>HOME</key>
  <string>/Users/yourname</string>
</dict>

诊断命令

bash
# 检查服务进程的实际环境变量(Linux)
cat /proc/$(pgrep -f openclaw)/environ | tr '\0' '\n' | grep -E 'API_KEY|OPENCLAW'