问题现象
在一台 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 图形会话更早启动。由于启动太早,它没有拿到 DISPLAY 和 XAUTHORITY 等变量,最终导致无法打开可见浏览器。
问题本质不是浏览器损坏,也不是 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 进程环境中包含 DISPLAY 和 XAUTHORITY,再通过 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 进程没有继承 DISPLAY、XAUTHORITY 等图形环境变量,因此无法打开可见浏览器。
最终修复方式不是修改 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 主配置文件。