以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
相关产品推荐
相关产品推荐

