Bug: gateway install fails on fresh Linux servers — execFileUtf8 clobbers systemctl stdout
OpenClaw 版本: 2026.3.2
操作系统: Ubuntu 24.04 LTS
Node: v22.22.0
Ubuntu 服务器安装 OpenClaw 网关服务时,因 execFileUtf8 函数处理 systemctl 非零退出码逻辑缺陷,导致 stdout 的 not-found 信息被 stderr 覆盖,引发 Gateway service check failed 错误。修复方案涉及调整 execFileUtf8 或 readSystemctlDetail 函数逻辑,优先识别 unit-not-found 状态。临时解决方案为手动创建 systemd user service 文件并启用服务。
OpenClaw 版本: 2026.3.2
操作系统: Ubuntu 24.04 LTS
Node: v22.22.0

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
在全新的 Linux 服务器(Ubuntu 22.04/24.04)上,openclaw gateway install 命令失败。这些服务器上 systemd user services 已正确配置,但 openclaw-gateway service 尚未安装。
Gateway service check failed: Error: systemctl is-enabled unavailable: Command failed: systemctl --user is-enabled openclaw-gateway.service
在 dist/systemd-*.js 文件中,isSystemdServiceEnabled() 函数调用 execFileUtf8("systemctl", ["--user", "is-enabled", "openclaw-gateway.service"])。
当服务不存在时,systemctl 返回:
execFileUtf8 函数处理非零退出码时,会用 error.message 替换空的 stderr:
const stderrText = String(stderr ?? ""); resolve({ stdout: String(stdout ?? ""), stderr: stderrText || (typeof e.message === "string" ? e.message : ...), code: typeof e.code === "number" ? e.code : 1 });
这导致:
然后 readSystemctlDetail() 优先选择 stderr(truthy)而非 stdout:
function readSystemctlDetail(result) { return (result.stderr || result.stdout || "").trim(); }
所以 detail = "Command failed: systemctl --user is-enabled openclaw-gateway.service" — 而不是 "not-found"。
isSystemdUnitNotEnabled(detail) 检查 "not-found",但 detail 字符串是错误消息,所以返回 false。代码继续执行并抛出异常。
openclaw gateway install --port 18789 --forcegateway install 应识别退出码 4 / "not-found" 为 "服务尚未安装",并继续创建服务文件。
三选一:
在调用 openclaw gateway start 前手动创建 systemd user service 文件:
mkdir -p ~/.config/systemd/user cat > ~/.config/systemd/user/openclaw-gateway.service << EOF [Unit] Description=OpenClaw Gateway After=network-online.target Wants=network-online.target [Service] ExecStart=$(which node) $(realpath $(which openclaw)) gateway run --port 18789 Restart=always RestartSec=5 KillMode=process WorkingDirectory=$HOME/.openclaw [Install] WantedBy=default.target EOF systemctl --user daemon-reload systemctl --user enable openclaw-gateway.service systemctl --user start openclaw-gateway.service
v2026.3.2 更新日志提到修复了 "container systemd checks"(#26089),但那仅覆盖 ENOENT/EACCES 情况 — 不包括这个 systemd 可用但单元尚不存在的退出码 4 场景。