Appearance
[社区] Gateway 作为系统服务启动失败:环境变量未传递给服务进程
问题
openclaw gateway start 手动在终端执行正常,但通过 systemd/LaunchAgent/PM2 等服务方式启动时 Gateway 失败,常见症状包括:
- API key 认证失败(401/403)
- 无法找到配置文件
- Gateway 立即退出但无明显错误日志
根本原因:环境变量(如 ANTHROPIC_API_KEY、OPENAI_API_KEY、OPENCLAW_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'