问题现象

在一台 Arch Linux + KDE 桌面环境中,OpenClaw 升级后出现了一个问题:终端中的 OpenClaw TUI 可以正常连接 Gateway,Agent 状态也显示为 connected / idle,但执行“打开浏览器”之类的任务时失败。

报错大意如下:

无法打开可见浏览器:
OpenClaw 服务环境未检测到 $DISPLAY 或 $WAYLAND_DISPLAY,
当前也没有可用浏览器实例。

这说明 OpenClaw Gateway 本身并没有崩溃,WebSocket 连接、Agent 会话和后端服务都还在运行。问题集中在一个地方:Gateway 进程无法访问当前 KDE 图形会话,因此不能启动可见浏览器窗口。

初步判断

Linux 桌面环境中,GUI 程序通常依赖一些图形会话环境变量,例如:

DISPLAY
WAYLAND_DISPLAY
XAUTHORITY
XDG_SESSION_TYPE
XDG_CURRENT_DESKTOP
DBUS_SESSION_BUS_ADDRESS
XDG_RUNTIME_DIR

在 KDE 终端里执行检查时,当前 shell 环境是正常的:

echo "DISPLAY=$DISPLAY"
echo "WAYLAND_DISPLAY=$WAYLAND_DISPLAY"
echo "XAUTHORITY=$XAUTHORITY"
echo "XDG_SESSION_TYPE=$XDG_SESSION_TYPE"
echo "XDG_CURRENT_DESKTOP=$XDG_CURRENT_DESKTOP"
echo "DBUS_SESSION_BUS_ADDRESS=$DBUS_SESSION_BUS_ADDRESS"
echo "XDG_RUNTIME_DIR=$XDG_RUNTIME_DIR"

可以看到类似结果:

DISPLAY=:0
XAUTHORITY=/tmp/xauth_xxxxxx
XDG_SESSION_TYPE=x11
XDG_CURRENT_DESKTOP=KDE
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
XDG_RUNTIME_DIR=/run/user/1000

但是进一步检查 OpenClaw Gateway 进程环境:

PID="$(systemctl --user show -p MainPID --value openclaw-gateway.service)"
echo "PID=$PID"

tr '\0' '\n' < "/proc/$PID/environ" \
  | grep -E '^(DISPLAY|XAUTHORITY|WAYLAND_DISPLAY|XDG_SESSION_TYPE|XDG_CURRENT_DESKTOP|DBUS_SESSION_BUS_ADDRESS|XDG_RUNTIME_DIR)=' || true

结果只包含:

XDG_RUNTIME_DIR=/run/user/1000
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus

缺少关键的:

DISPLAY
XAUTHORITY
XDG_SESSION_TYPE
XDG_CURRENT_DESKTOP

这就确认了问题:OpenClaw Gateway 作为 systemd user service 启动时,没有继承 KDE 图形会话环境。

排查 systemd user service

继续检查 OpenClaw 的 systemd 用户服务:

systemctl --user cat openclaw-gateway.service

可以看到主 service 文件中存在:

[Install]
WantedBy=default.target

同时,之前为了解决图形环境启动顺序问题而创建的 override 文件仍然存在:

# ~/.config/systemd/user/openclaw-gateway.service.d/override.conf

[Unit]
After=graphical-session.target
PartOf=graphical-session.target

这说明之前的修复并没有完全消失。

接着检查 OpenClaw 被挂在哪些 target 下:

find ~/.config/systemd/user/default.target.wants \
  -maxdepth 1 \
  -type l \
  -name '*openclaw*' \
  -printf '%p -> %l\n' 2>/dev/null || true

find ~/.config/systemd/user/graphical-session.target.wants \
  -maxdepth 1 \
  -type l \
  -name '*openclaw*' \
  -printf '%p -> %l\n' 2>/dev/null || true

结果显示两个地方都存在 OpenClaw Gateway 的启动链接:

~/.config/systemd/user/default.target.wants/openclaw-gateway.service
~/.config/systemd/user/graphical-session.target.wants/openclaw-gateway.service

这就是问题的关键。

问题是怎么出现的

OpenClaw 升级后,主 service 文件被更新到了新版本。升级过程没有删除之前的 override 文件,但重新恢复或创建了 default.target.wants/openclaw-gateway.service 这个启动链接。

于是实际状态变成:

旧修复仍然存在:
- graphical-session.target.wants/openclaw-gateway.service
- openclaw-gateway.service.d/override.conf

升级后恢复的旧启动入口也存在:
- default.target.wants/openclaw-gateway.service

这导致 OpenClaw Gateway 同时挂在两个 target 下。

在一次启动日志中可以看到类似顺序:

Started OpenClaw Gateway
Reached target Current graphical user session

也就是说,OpenClaw Gateway 比 KDE 图形会话更早启动。由于启动太早,它没有拿到 DISPLAYXAUTHORITY 等变量,最终导致无法打开可见浏览器。

问题本质不是浏览器损坏,也不是 OpenClaw 认证失败,更不是配置文件中的密码或 token 问题,而是 systemd user service 的启动顺序和环境继承问题。

修复方法

这次不需要重写整个 service,也不需要修改 OpenClaw 主配置文件。正确做法是保留原来的 graphical-session 修复,只删除升级后恢复出来的 default.target 启动链接。

执行:

rm ~/.config/systemd/user/default.target.wants/openclaw-gateway.service

systemctl --user daemon-reload

然后确认 default.target.wants 下已经没有 OpenClaw:

find ~/.config/systemd/user/default.target.wants \
  -maxdepth 1 \
  -type l \
  -name '*openclaw*' \
  -printf '%p -> %l\n' 2>/dev/null || true

理想状态是没有任何输出。

再确认 graphical-session.target.wants 下仍然保留 OpenClaw:

find ~/.config/systemd/user/graphical-session.target.wants \
  -maxdepth 1 \
  -type l \
  -name '*openclaw*' \
  -printf '%p -> %l\n' 2>/dev/null || true

理想状态是:

~/.config/systemd/user/graphical-session.target.wants/openclaw-gateway.service -> ~/.config/systemd/user/openclaw-gateway.service

同时确认 override 文件仍然存在:

systemctl --user cat openclaw-gateway.service | grep -A5 -B2 'graphical-session'

应能看到:

[Unit]
After=graphical-session.target
PartOf=graphical-session.target

当前会话中立即恢复

如果不想等下次重启,也可以让当前 systemd user manager 导入图形环境变量,并重启 OpenClaw Gateway:

systemctl --user import-environment \
  DISPLAY WAYLAND_DISPLAY XAUTHORITY \
  XDG_SESSION_TYPE XDG_CURRENT_DESKTOP \
  DBUS_SESSION_BUS_ADDRESS XDG_RUNTIME_DIR

systemctl --user restart openclaw-gateway.service

然后检查 Gateway 进程是否已经拿到图形环境:

PID="$(systemctl --user show -p MainPID --value openclaw-gateway.service)"
echo "PID=$PID"

tr '\0' '\n' < "/proc/$PID/environ" \
  | grep -E '^(DISPLAY|XAUTHORITY|WAYLAND_DISPLAY|XDG_SESSION_TYPE|XDG_CURRENT_DESKTOP|DBUS_SESSION_BUS_ADDRESS|XDG_RUNTIME_DIR)=' || true

如果能看到类似:

DISPLAY=:0
XAUTHORITY=/tmp/xauth_xxxxxx
XDG_SESSION_TYPE=x11
XDG_CURRENT_DESKTOP=KDE
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
XDG_RUNTIME_DIR=/run/user/1000

说明 OpenClaw Gateway 已经正确继承 KDE 图形环境。

重启验证

修复后重启系统,登录 KDE 桌面,再检查:

PID="$(systemctl --user show -p MainPID --value openclaw-gateway.service)"
echo "PID=$PID"

tr '\0' '\n' < "/proc/$PID/environ" \
  | grep -E '^(DISPLAY|XAUTHORITY|WAYLAND_DISPLAY|XDG_SESSION_TYPE|XDG_CURRENT_DESKTOP|DBUS_SESSION_BUS_ADDRESS|XDG_RUNTIME_DIR)=' || true

如果 Gateway 进程环境中包含 DISPLAYXAUTHORITY,再通过 OpenClaw TUI 执行打开浏览器的任务,浏览器可以正常启动,就说明修复成功。

备份文件整理

排查过程中发现旧备份文件名类似:

openclaw-gateway.service.bak

为了避免 .bak 文件名过于模糊,可以改成带日期时间的形式:

cd ~/.config/systemd/user

mv openclaw-gateway.service.bak "openclaw-gateway.service.$(date +%Y%m%d-%H%M%S)"

ls -l openclaw-gateway.service*

例如:

openclaw-gateway.service.20260611-190305

这种命名方式更容易判断备份产生时间,也不会影响当前正在使用的:

openclaw-gateway.service
openclaw-gateway.service.d/override.conf

总结

这次故障的根本原因是:OpenClaw 升级后,systemd user service 的启动入口被部分重置,default.target.wants/openclaw-gateway.service 链接重新出现,导致 Gateway 在 KDE 图形会话 ready 之前启动。

由于启动太早,Gateway 进程没有继承 DISPLAYXAUTHORITY 等图形环境变量,因此无法打开可见浏览器。

最终修复方式不是修改 OpenClaw 主配置,也不是调整认证、密码或浏览器 profile,而是清理 systemd user service 的启动关系:

删除:
default.target.wants/openclaw-gateway.service

保留:
graphical-session.target.wants/openclaw-gateway.service
openclaw-gateway.service.d/override.conf

修复后,OpenClaw Gateway 会跟随 KDE 图形会话启动,从而正常继承图形环境,恢复可见浏览器功能。

以后每次 OpenClaw 升级后,如果再次出现“无法打开可见浏览器”“未检测到 DISPLAY 或 WAYLAND_DISPLAY”之类的问题,应优先检查 systemd user target 链接,而不是急着修改 OpenClaw 主配置文件。

Leave a Reply

Your email address will not be published. Required fields are marked *