Ubuntu安装OpenClaw报错Gateway service check failed解决方法

Bug: gateway install fails on fresh Linux servers — execFileUtf8 clobbers systemctl stdout

来源: GitHub Issue #32635

OpenClaw 版本: 2026.3.2
操作系统: Ubuntu 24.04 LTS
Node: v22.22.0


问题描述

在全新的 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 返回:

  • 退出码: 4
  • stdout: "not-found\n"
  • stderr: "" (空)

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 }); 

这导致:

  • stdout: "not-found"
  • stderr: "Command failed: systemctl --user is-enabled openclaw-gateway.service" (被覆盖)

然后 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。代码继续执行并抛出异常。

复现步骤

  1. 全新 Ubuntu 服务器,已启用 systemd user services
  2. 通过 npm 全局安装 openclaw
  3. 运行 openclaw gateway install --port 18789 --force
  4. 观察错误

期望行为

gateway install 应识别退出码 4 / "not-found" 为 "服务尚未安装",并继续创建服务文件。

建议修复

三选一:

  1. execFileUtf8: 不再用 error.message 替换空的 stderr(或分开存储两者)
  2. readSystemctlDetail: 当 stderr 包含 "Command failed" 时,优先使用 stdout
  3. isSystemdServiceEnabled: 也直接检查 stdout 中的 unit-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 场景。


🎁 MiniMax 跨年福利来袭!邀好友享 Coding Plan 双重好礼,助力开发体验!好友立享 9折 专属优惠 + Builder 权益,你赢返利 + 社区特权!👉 立即参与

Read more

【C++ 函数模板】—— 模板参数推导、实例化策略与编译优化

【C++ 函数模板】—— 模板参数推导、实例化策略与编译优化

欢迎来到ZyyOvO的博客✨,一个关于探索技术的角落,记录学习的点滴📖,分享实用的技巧🛠️,偶尔还有一些奇思妙想💡 本文由ZyyOvO原创✍️,感谢支持❤️!请尊重原创📩!欢迎评论区留言交流🌟 个人主页 👉 ZyyOvO 本文专栏➡️C++ 进阶之路 各位于晏,亦菲们请看 * 引言 * 函数模板的概念 * 函数模板的匹配原则 * 函数模板的底层原理 * 模板的编译阶段 * 模板实例化 * 编译器与链接器的协作 * 编译器的工作流程 * 前端编译阶段 * 模板实例化阶段 * 后端编译阶段 * 函数模板总结 * 写在最后 引言 点击快速复习 👉:【C++ 函数重载】—— 现代编译技术下的多态表达与性能优化 上篇文章我们讲到C++的函数重载,包括函数重载的条件,原理以及一些易错事项,那么本文我们为大家介绍C++中泛型编程的主要方式——模板。 在 C++ 中,模板(Template)是一种强大的编程特性,它允许程序员编写与类型无关的代码,实现代码的复用和泛型编程。 如同模具一样,

By Ne0inhk
基础算法:滑动窗口_python版本

基础算法:滑动窗口_python版本

能使用滑动窗口的题,基本都需要数字为正整数,这样才能保证滑入一个数字总和是增加的(单调性) 一、209. 长度最小的子数组 * 思路: 已每个位置为右端点,依次加大左端点,最短不满足 sum(num[left,right]) < target的。 * 代码: classSolution:defminSubArrayLen(self, target:int, nums: List[int])->int: n =len(nums) ans = n +1# 也可以写 inf s = left =0for right, x inenumerate(nums):# 枚举子数组右端点 s += x while s >

By Ne0inhk
纯C++手撸PP-OCRv5文字识别!不依赖OpenCV,从零到跑通全流程

纯C++手撸PP-OCRv5文字识别!不依赖OpenCV,从零到跑通全流程

纯C++手撸PaddleOCR PP-OCRv5文字识别!不依赖OpenCV,从零到跑通全流程 你是不是也遇到过这种情况:想在C++项目里加个OCR功能,结果光装OpenCV就折腾半天?今天教你零OpenCV依赖,用Paddle Inference + stb_image,纯C++实现PP-OCRv5文字识别全流程(检测+识别),代码可直接跑! 一、效果先行 cd /home/michah/桌面/paddle_inference && ./build/ocr_demo build/640.png --text-only cd /home/michah/桌面/paddle_inference && ./build/ocr_demo build/640.png

By Ne0inhk
【算法通关指南:数据结构和算法篇】别再用指针写链表了!数组模拟单 / 双向链表,C++ 实战超丝滑

【算法通关指南:数据结构和算法篇】别再用指针写链表了!数组模拟单 / 双向链表,C++ 实战超丝滑

🔥小龙报:个人主页 🎬作者简介:C++研发,嵌入式,机器人方向学习者 ❄️个人专栏:《算法通关指南》 ✨ 永远相信美好的事情即将发生 文章目录 * 前言 * 一、链表的概念 * 1.1 链表的定义 * 1.2 链表的分类 * 二、链表的模拟实现 * 2.1 单链表的模拟实现 * 2.1.1 定义-创建-初始化 * 2.1.2 头插 * 2.1.3 遍历链表 * 2.1.4 按值查找 * 策略一:遍历整个链表 * 策略二:使用哈希表优化 * 2.1.5 在任意位置之后插入元素 * 2.

By Ne0inhk