You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

以root身份运行的脚本如何检测Wayland/X11图形系统?

检测当前图形系统(X11/Wayland)的优雅方案(root脚本可用)

下面是几个比依赖XAUTHORITY更可靠的方法,无需依赖root环境下的图形相关环境变量:

方法1:通过系统会话管理器(loginctl)直接获取会话类型

这是最可靠的方式,直接从systemd的会话管理中读取当前活跃图形会话的类型:

# 获取当前活跃会话ID
ACTIVE_SESSION=$(loginctl list-sessions | awk '/^[0-9]+/ && !/dead/ {print $1; exit}')
# 读取会话的Type字段(x11或wayland)
SESSION_TYPE=$(loginctl show-session "$ACTIVE_SESSION" -p Type --value)

echo "当前图形系统类型:$SESSION_TYPE"

原理:loginctl会跟踪所有系统会话,过滤掉已结束的dead会话后,就能拿到当前正在运行的图形会话,其Type字段直接标明了使用的显示协议。

方法2:读取当前活跃普通用户的环境变量

因为图形环境由普通用户启动,该用户的环境变量里包含准确的XDG_SESSION_TYPE,可以通过切换到该用户读取:

# 复用方法1的ACTIVE_SESSION变量,获取对应用户
ACTIVE_USER=$(loginctl show-session "$ACTIVE_SESSION" -p User --value)
# 读取该用户的XDG_SESSION_TYPE变量
SESSION_TYPE=$(su - "$ACTIVE_USER" -c 'echo "$XDG_SESSION_TYPE"')

echo "当前图形系统类型:$SESSION_TYPE"

如果已经知道当前登录的普通用户名(比如固定为myuser),可以直接用su - myuser -c 'echo $XDG_SESSION_TYPE',但通过loginctl动态获取用户更通用。

方法3:检测运行中的显示服务器进程

通过查找系统中正在运行的显示服务器进程来判断:

if ps aux | grep -qE '^[^ ]+ +[0-9]+ +[0-9.]+ +.+Xorg(:[0-9]+)?$'; then
    echo "当前图形系统是X11"
elif ps aux | grep -qE '^[^ ]+ +[0-9]+ +[0-9.]+ +.+gnome-shell --wayland|kwin_wayland|weston'; then
    echo "当前图形系统是Wayland"
fi

注意:不同桌面环境的Wayland进程名称可能不同(比如KDE用kwin_wayland),可以根据需要调整匹配规则。

内容的提问来源于stack exchange,提问作者OscarAkaElvis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 13:35:20