如何确定正在运行的窗口管理器(和桌面环境)

有没有办法(比如命令或环境变量)可以确定当前会话中正在运行的窗口管理器是哪一个?
15个回答

如果您已经安装了wmctrl,则可以通过命令的第一行输出来判断。
wmctrl -m

会显示窗口管理器的名称。如果您没有安装wmctrl,请使用以下命令进行安装:
sudo apt-get install wmctrl

注意,man wmctrl(即wmctrlman页)部分内容如下:

-m 显示有关窗口管理器的信息...

在我的Ubuntu 11.10 / Linux 3.0.0-14-generic #23-Ubuntu x86_64 / metacity 2.34.1系统上,wmctrl -m的输出的第一行是:Name: Metacity
echo $DESKTOP_SESSION显示ubuntu-2decho $XDG_CURRENT_DESKTOP显示Unity
在一台老旧笔记本上新安装了Ubuntu 15.10的Ubuntu桌面软件后,wmctrl -m的输出的第一行为:Name: Compiz
DESKTOP_SESSIONXDG_CURRENT_DESKTOP的值分别为ubuntuUnity

5很遗憾,即使启用了X11,这在ssh上也无法工作。 - Sridhar Sarnobat
2在Ubuntu 15.04上,运行ssh -Y {host} 'wmctrl -m'命令会返回一些值(例如,“Name: Compiz”和几个N/A),但是ssh对于窗口管理器的信息有限是可以理解的。 - michael
在运行Cinnamon的Debian系统中,这个不起作用。wmctrl -m的输出是 Name: Mutter(Muffin) 而$XDG_CURRENT_DESKTOP=X-Cinnamon。 - Floyd
在Xubuntu Wily上,运行Window Maker 0.95.6 - wmctrl报告所有条目为N/A。GDMSESSION设置为wmaker-common,但XDG_CURRENT_DESKTOP没有被设置。 - Mei
@Mei,你有在其他系统上运行Window Maker并进行比较吗?另外,在Xubuntu Wily上使用Window Maker时,wmctrl -d(列出由窗口管理器管理的所有桌面)和wmctrl -l(列出由窗口管理器管理的窗口)是否正常工作? - James Waldby - jwpat7
1注意:对于不熟悉Ubuntu的用户,请注意。在RedHat上,可以从nux-dextop软件源中获取wmctrl(请参考https://unix.stackexchange.com/questions/447999/identify-and-restart-gnome-classic-window-manager-on-rhel7)。 - Bruce Adams
@SridharSarnobat,XServer在本地系统上运行,因此您不需要ssh到它。如果您正在运行Windows(没有Xserver),那么ssh到远程服务器时,您的连接可能不会与显示相关联。 - PatS
最后一行说:“窗口管理器的“显示桌面”模式:关闭”。这是什么意思? - Timo
在freedesktop.org的“扩展窗口管理提示”中,@Timo Per _NET_SHOWING_DESKTOP条目如果开启,窗口将被隐藏,只显示和聚焦于桌面背景。也许不是每天都需要使用。 - James Waldby - jwpat7
友好澄清一下:$DESKTOP_SESSION实际上是返回窗口管理器,这才是正确的答案。- 更多细节请参见 - https://askubuntu.com/a/125072/970554 - 而$XDG_CURRENT_DESKTOP则是返回桌面环境 - Manuel Jordan

在我测试的Linux系统上,我查看了环境变量 XDG_CURRENT_DESKTOPGDMSESSION 并得到了以下结果。

You can use this line to get the output:

printf 'Desktop: %s\nSession: %s\n' "$XDG_CURRENT_DESKTOP" "$GDMSESSION"

Ubuntu 18.04和20.04(Ubuntu上的GNOME)

  • XDG_CURRENT_DESKTOP=ubuntu:GNOME
  • GDMSESSION=ubuntu

Ubuntu 18.04(Ubuntu上的Wayland)

  • XDG_CURRENT_DESKTOP=ubuntu:GNOME
  • GDMSESSION=ubuntu-wayland

Ubuntu 16.04

Unity (7)

  • XDG_CURRENT_DESKTOP=Unity
  • GDMSESSION=ubuntu

Ubuntu 14.04

使用Mir运行的Unity

  • XDG_CURRENT_DESKTOP=Unity
  • GDMSESSION=ubuntu

注意 MIR_SERVER_NAME也被设置了

  • MIR_SERVER_NAME=session-$NUMBER

不使用Mir运行的Unity

  • XDG_CURRENT_DESKTOP=Unity
  • GDMSESSION=ubuntu

XFCE

  • XDG_CURRENT_DESKTOP=XFCE
  • GDMSESSION=xfce

Ubuntu 12.04

KDE

  • XDG_CURRENT_DESKTOP=
  • GDMSESSION=kde-plasma

Unity 3D

  • XDG_CURRENT_DESKTOP=Unity
  • GDMSESSION=ubuntu

Unity 2D

  • XDG_CURRENT_DESKTOP=Unity
  • GDMSESSION=ubuntu-2d

Gnome

  • XDG_CURRENT_DESKTOP=GNOME
  • GDMSESSION=gnome-shell

Gnome Classic

  • XDG_CURRENT_DESKTOP=GNOME
  • GDMSESSION=gnome-classic

Gnome Classic (no effects)

  • XDG_CURRENT_DESKTOP=GNOME
  • GDMSESSION=gnome-fallback

其他基于Ubuntu的发行版

Mint 13(Cinnamon)

  • XDG_CURRENT_DESKTOP=GNOME
  • GDMSESSION=cinnamon

Mint 16(KDE版)

  • XDG_CURRENT_DESKTOP=KDE
  • GDMSESSION=default

Mint 17(Cinnamon)

  • XDG_CURRENT_DESKTOP=X-Cinnamon
  • GDMSESSION=default

Lubuntu 12.04

  • XDG_CURRENT_DESKTOP=LXDE
  • GDMSESSION=Lubuntu

Wasta 14.04 / 18.04

  • XDG_CURRENT_DESKTOP=X-Cinnamon
  • GDMSESSION=cinnamon

Wasta 14.04 使用 Gnome 桌面。

  • XDG_CURRENT_DESKTOP=GNOME
  • GDMSESSION=gnome

Ubuntu Mate 18.04

  • XDG_CURRENT_DESKTOP=MATE
  • GDMSESSION=mate

Xubuntu 18.04

  • XDG_CURRENT_DESKTOP=XFCE
  • GDMSESSION=xubuntu

Kali Linux kali-rolling 2020.2

  • XDG_CURRENT_DESKTOP=GNOME
  • GDMSESSION=lightdm-xsession

4Mint 13(Cinnamon):XDG_CURRENT_DESKTOP=GNOME,GDMSESSION=cinnamon - rik-shaw
1Lubuntu 12.04: XDG_CURRENT_DESKTOP=LXDE, GDMSESSION=Lubuntu - rik-shaw
2$DESKTOP_SESSION是什么情况?作为备用解决方案 :) - Savvas Radevic
1如果我不使用GDM会怎样? - Robert Siemer
12而且它还没有回答我使用的窗口管理器是什么! - Robert Siemer
真的$DESKTOP_SESSION返回的是窗口管理器 - 这是正确的答案。- 更多细节请参见 - https://askubuntu.com/a/125072/970554 - 而$XDG_CURRENT_DESKTOP返回的是桌面环境 - Manuel Jordan
@RobertSiemer 在某种程度上,答案是正确的 - 似乎 GDMSESSION 返回的是窗口管理器 - 当然我们对 $XDG_CURRENT_DESKTOP 返回的是桌面环境也是正确的。 - Manuel Jordan

在终端中输入env以查看所有环境变量。其中一些是: XDG_CURRENT_DESKTOP - 告诉你正在使用的桌面环境 GDMSESSION - 告诉你从lightdm greeter选择的登录选项。
要使用它们,请打开终端并输入:
echo $XDG_CURRENT_DESKTOP

(如果您正在使用Unity,则会输出“unity”等内容)
或者
echo $GDMSESSION  

(如果您在登录中选择了ubuntu,则将输出“ubuntu”,如果选择了“ubuntu-2d”,则将输出“ubuntu-2d”)。
如果仔细查看“env”命令的输出,会发现还有其他选项,比如“DESKTOP_SESSION”和“COMPIZ_CONFIG_PROFILE”。
由于您要找到正在使用的窗口管理器的名称,我唯一能想到的方法是查看进程列表。为此,可以使用一个名为“pgrep”的命令(参考Wikipedia)。我执行了以下命令来获得名称,因为参数“-l”会添加进程ID: pgrep -l compiz |cut -d " " -f2,由于该进程是以相同的用户身份运行的,所以不需要加上sudo前缀。然后,您可以使用这个命令创建一个脚本,根据窗口管理器执行相应的操作。
要查找其他类型的窗口管理器,只需将单词“compiz”更改为其他单词,比如“mutter”、“kwin”等。

4这些只是告诉我会话名称和桌面环境。例如,它说“GNOME”,这是一个可以使用Metacity、Mutter、Compiz或其他窗口管理器的桌面环境。它说“gnome-classic”,这是一个会话名称,没有这样的窗口管理器的名字。 - Anonymous
1找到了一个可以帮助处理进程列表的命令,叫做pgrep。至少它会显示窗口管理器的名称,如果找到的话。我正在尝试检查是否可以将它们全部添加在一起。你的问题很好,因为Ubuntu 11.10使用Compiz(或者在Gnome 3.x时使用Mutter)有点让人困惑,所以指出Unity实际使用的窗口管理器会很好。 - Luis Alvarado
1$XDG_CURRENT_DESKTOP 是当前的桌面环境,而不是窗口管理器。 - Ken Sharp
似乎GDMSESSION返回的是窗口管理器,而且当然$XDG_CURRENT_DESKTOP返回的是桌面环境 - Manuel Jordan

我发现pstree非常有帮助。

安装

sudo apt-get install pstree

输出

这是我得到的。

 ├─lightdm─┬─Xorg───2*[{Xorg}]
 │         ├─lightdm─┬─gnome-session─┬─bluetooth-apple───2*[{bluetooth-apple}]
 │         │         │               ├─compiz─┬─sh───gtk-window-deco───2*[{gtk-window-deco}]
 │         │         │               │        └─5*[{compiz}]
 │         │         │               ├─deja-dup-monito───2*[{deja-dup-monito}]
 │         │         │               ├─gnome-fallback-───2*[{gnome-fallback-}]
 │         │         │               ├─gnome-screensav───2*[{gnome-screensav}]
 │         │         │               ├─gnome-settings-───2*[{gnome-settings-}]
 │         │         │               ├─nautilus───2*[{nautilus}]
 │         │         │               ├─nm-applet───2*[{nm-applet}]
 │         │         │               ├─polkit-gnome-au───2*[{polkit-gnome-au}]
 │         │         │               ├─ssh-agent
 │         │         │               ├─telepathy-indic───2*[{telepathy-indic}]
 │         │         │               ├─update-notifier───2*[{update-notifier}]
 │         │         │               ├─vino-server───2*[{vino-server}]
 │         │         │               ├─zeitgeist-datah───{zeitgeist-datah}
 │         │         │               └─3*[{gnome-session}]
 │         │         └─{lightdm}
 │         └─2*[{lightdm}]

2这让我成功使用了我的定制的Buildroot系统。 - jc__
1对于我在Ubuntu 22.04上来说,pstree是预装的。 - Chris Hayes

xprop -id $(xprop -root -notype | awk '$1=="_NET_SUPPORTING_WM_CHECK:"{print $5}') -notype -f _NET_WM_NAME 8t 

3你能解释一下这是怎么工作的吗?另外,我觉得你漏了一个 ) 在结尾处。 - Louis Matthijssen
@LouisMatthijssen 1. xprop -root -notype 显示了根窗口的所有属性(并省略了类型以便于解析),输出通过管道发送到 awk;2. awk 命令 $1=="_NET[blah]CK:"{print $5}' 将输入管道中每行的第一列与给定字符串进行比较,如果找到匹配项,则运行括号中的代码,该代码打印此行的第五列 - 恰好是 "_NET_SUPPORTING_WM_CHECK" 原子的 ID(我敢打赌这完全是偶然);3. 然后再次使用此 ID 通过 xprop -id 获取窗口管理器的属性。 - cprn
虽然没有检测到毒鼠药,但它让我朝着正确的方向前进。 - hildred

只是一点建议。
$ sudo apt install neofetch
$ neofetch

enter image description here


#! /bin/bash


windowManagerName () {
    local window=$(
        xprop -root -notype
    )

    local identifier=$(
        echo "${window}" |
        awk '$1=="_NET_SUPPORTING_WM_CHECK:"{print $5}'
    )

    local attributes=$(
        xprop -id "${identifier}" -notype -f _NET_WM_NAME 8t
    )

    local name=$(
        echo "${attributes}" |
        grep "_NET_WM_NAME = " |
        cut --delimiter=' ' --fields=3 |
        cut --delimiter='"' --fields=2
    )

    echo "${name}"
}


windowManagerName

或者一行代码: id=$(xprop -root -notype | awk '$1=="_NET_SUPPORTING_WM_CHECK:"{print $5}'); xprop -id "${id}" -notype -f _NET_WM_NAME 8t | grep "_NET_WM_NAME = " | cut --delimiter=' ' --fields=3 | cut --delimiter='"' --fields=2

1这完全回答了问题!我找到的唯一答案。 - opinion_no9

我还使用KDE进行了测试,我的结论是:

a)图形方式,使用HardInfo:通常答案在“操作系统”>“桌面环境”,如果没有的话可以查看“环境变量”。HardInfo已准备好所有经过测试的发行版,除了带有KDE的那个,但它可以轻松快速地安装(在Linux Mint 13中只需2个软件包)。

b)命令行方式,使用以下命令:ps -A | egrep -i "gnome|kde|mate|cinnamon|lx|xfce|jwm" -wo | sort -u。出现次数最多的项目应该是答案(如果存在平局,则以带有“session”的项目为解决方案)。而且它可以通过SSH工作。


XFCE还有几个gnome-...进程(以及一个带有kdevtmpfs的kde命中)。 - Xen2050
@Msedfi 如果 WM 是 "lightdm",则不起作用。 - SebMa

以上的方法都对我没有用,我只是想知道我当前的桌面会话是否是Gnome。
以下是有效的方法,打开一个终端。
lsb_release -a

(为了检查我在UBUNTU机器上安装的口味或版本)
ls /usr/bin/*session

当前正在使用的桌面会话/桌面环境是什么?
gnome-shell --version 

(查找已安装的 GNOME 版本)

ls /usr/bin/*session 显示了已安装的内容。 - AlexOnLinux

这个问题已经有9年了,但仍然是一个热门话题。 在我的Ubuntu 20.04.2 LTS上,我得到的结果是:
wmctrl -m:GNOME Shell
inxi -Sxx:桌面 = Gnome 3.36.4;窗口管理器 = gnome-shell;显示管理器 = GDM3 3.36.3
gnome-shell -- version:3.36.4
env:GDM_SESSION : ubuntu;DESKTOP_SESSION: ubuntu;XDG_CURRENT_DESKTOP: ubuntu:GNOME
但是
xprop...(来自ruario):_NET_WM_NAME:GNOME Shell;_GNOME_WM_KEYBINDINGS:Mutter, GNOME Shell;_MUTTER_VERSION:3.36.7
以及neofetch:de = GNONE;wm = Mutter
从这些信息中推断出(但不是非常确定):GNOME是桌面管理器,而GNOME Shell是窗口管理器(Mutter可能是我之前的LTS版本16.04和18.04的遗留痕迹)。

这显示了整个线程中所有内容和结论是多么混乱。正如neofetch非常有帮助地和准确地指出的那样,您的窗口管理器确实是Mutter。(如果有用的话)我在一个全新安装的20.04上也使用Mutter。 - Levente