在 Ubuntu 系统中,判断是否有桌面环境(Desktop Environment, DE)正在运行,核心逻辑是检测是否存在特定的窗口管理器进程或显示服务器会话变量。命令行环境通常没有这些组件,而图形界面环境则必然包含。
以下是几种最准确、最常用的检测方法,按推荐程度排序:
1. 检查 DESKTOP_SESSION 环境变量(最标准)
这是最“官方”且可靠的方法。大多数现代桌面环境在安装时会设置此变量。
echo $DESKTOP_SESSION
- 如果输出为空:说明当前可能处于纯文本终端(TTY)、SSH 远程连接,或者未配置桌面会话。
- 如果输出了如
ubuntu、gnome、kde-plasma、xfce等值:说明存在桌面环境配置,但不一定表示它当前正在前台运行(例如你可能通过 SSH 登录,但用户账户配置了 GNOME)。
注意:此方法仅反映“配置”,不反映“实时状态”。要确认是否真的在运行,需结合以下方法。
2. 检查关键窗口管理器进程(最实时、最准确)
桌面环境的本质是一个窗口管理器(Window Manager)和一个会话管理器(Session Manager)的组合。你可以检查这些进程是否存在。
对于 GNOME(Ubuntu 默认桌面):
pgrep -a gnome-shell
# 或
systemctl --user status gnome-session.target
对于 KDE Plasma:
pgrep -a plasmashell
对于 XFCE:
pgrep -a xfce4-session
通用方法:检查 X11 或 Wayland 相关进程
# 检查 Xorg 是否在运行(传统 X11 显示服务器)
pgrep -a Xorg
# 检查 Wayland 复合窗口管理器(现代 Ubuntu 使用 Wayland)
pgrep -a mutter # GNOME on Wayland
pgrep -a kwin_wayland # KDE on Wayland
✅ 结论判断:
- 如果
pgrep -a Xorg或pgrep -a mutter等有输出,则确定有图形桌面环境在运行。 - 如果所有上述命令均无输出,则当前为纯命令行环境。
3. 检查 /run/user/$UID/gdm/ 或类似会话目录(针对 GDM/LightDM)
Ubuntu 使用 GDM(GNOME Display Manager)作为默认登录管理器。当图形会话启动时,会创建相应的运行时目录。
ls /run/user/$(id -u)/gdm/ 2>/dev/null && echo "GDM session active" || echo "No GDM session"
更通用的方法是检查是否存在 dbus 会话总线实例属于当前用户,并且该总线关联了图形服务:
busctl --user list | grep -E 'org.gnome.Shell|org.kde.plasmashell'
4. 快速一键脚本(推荐复制使用)
将以下脚本保存为 check-desktop.sh,可快速判断:
#!/bin/bash
# 方法1: 检查环境变量
if [ -z "$DESKTOP_SESSION" ]; then
echo "[INFO] DESKTOP_SESSION is not set."
else
echo "[INFO] DESKTOP_SESSION is set to: $DESKTOP_SESSION"
fi
# 方法2: 检查关键进程
DETECTED_DE=""
if pgrep -x gnome-shell > /dev/null; then
DETECTED_DE="GNOME"
elif pgrep -x plasmashell > /dev/null; then
DETECTED_DE="KDE Plasma"
elif pgrep -x xfce4-session > /dev/null; then
DETECTED_DE="XFCE"
elif pgrep -x cinnamon-session > /dev/null; then
DETECTED_DE="Cinnamon"
elif pgrep -x lxsession > /dev/null; then
DETECTED_DE="LXDE/LXQt"
fi
if [ -n "$DETECTED_DE" ]; then
echo "[RESULT] Desktop environment '$DETECTED_DE' is running."
else
echo "[RESULT] No known desktop environment detected in current process list."
echo "[NOTE] You may be in a TTY, SSH session, or using a minimal WM (like i3, openbox)."
fi
常见场景辨析
| 场景 | echo $DESKTOP_SESSION |
pgrep gnome-shell |
说明 |
|---|---|---|---|
| 本地物理机,已登录 GUI | 非空(如 ubuntu) |
有输出 | ✅ 桌面运行中 |
| SSH 登录到同一台机器 | 可能非空(取决于 PAM 配置) | 无输出 | ❌ 桌面未在当前会话运行 |
| 纯 TTY(Ctrl+Alt+F3) | 空 | 无输出 | ❌ 无桌面 |
| 云服务器(最小化安装) | 空 | 无输出 | ❌ 无桌面 |
补充:如何查看当前使用的显示协议?
echo $XDG_SESSION_TYPE
- 输出
tty:纯文本控制台。 - 输出
x11:X11 图形会话。 - 输出
wayland:Wayland 图形会话。
⚠️ 注意:
$XDG_SESSION_TYPE在非图形会话中可能为空或未定义。
总结
- 最可靠方法:
pgrep -a gnome-shell(或其他对应 WM 进程名)。 - 最便捷方法:
echo $XDG_SESSION_TYPE,若不为tty且不为空,则大概率有桌面。 - 避免误判:不要仅依赖
$DESKTOP_SESSION,因为它可能在 SSH 会话中被继承,即使没有实际图形界面运行。
CLOUD云枢