如何确定哪个窗口管理器正在运行


179

有什么方法(例如命令或环境变量)来确定当前会话中正在积极运行的窗口管理器

Answers:


145

如果已wmctrl安装,则命令的第一行输出

    wmctrl -m

将显示窗口管理器的名称。如果尚未wmctrl安装,请使用以下命令进行安装:

    sudo apt-get install wmctrl

请注意,man wmctrl(即的man页面wmctrl)部分表示:

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

在我的Ubuntu 11.10 / Linux的3.0.0-14泛型#23,Ubuntu的x86_64的/ Metacity的2.34.1系统,从输出的第一行wmctrl -m是: Name: Metacity
同时echo $DESKTOP_SESSION显示ubuntu-2decho $XDG_CURRENT_DESKTOP显示Unity

Ubuntu desktop旧笔记本电脑上全新安装的Ubuntu 15.10 软件上,第一行的输出wmctrl -m为:Name: Compiz
DESKTOP_SESSIONand XDG_CURRENT_DESKTOP值为ubuntuandUnity


4
不幸的是,即使启用了X11,它也不能通过ssh进行工作。
Sridhar Sarnobat 2014年

1
@ubridu 15.04上的@ Sridhar-Sarnobat,运行时ssh -Y {host} 'wmctrl -m'会返回一些值(例如,“名称:Compiz”和几个N / A),但ssh在窗口管理器中包含有限的信息是有道理的。
迈克尔(Michael)2015年

在运行Debian的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。
2016年

@Mei,您是否可以在可以比较的任何其他系统上运行Window Maker?此外, wmctrl -dwmctrl -l使用Window Maker在Xubuntu Wily上)(列出由窗口管理器管理的所有桌面)或 (列出由窗口管理器管理的窗口)中的任何一个都可以正常工作吗?
詹姆斯·沃尔德比-jwpat7'7

101

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

您可以使用此行获取输出:

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

Ubuntu 18.04(Ubuntu)

  • XDG_CURRENT_DESKTOP=ubuntu:GNOME
  • GDMSESSION=ubuntu

Ubuntu 18.04(Wayland上的Ubuntu)

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

Ubuntu 16.04


团结(7)

  • XDG_CURRENT_DESKTOP=Unity
  • GDMSESSION=ubuntu

Ubuntu 14.04


Unity与Mir一起运行

  • 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

侏儒

  • XDG_CURRENT_DESKTOP=GNOME
  • GDMSESSION=gnome-shell

侏儒经典

  • XDG_CURRENT_DESKTOP=GNOME
  • GDMSESSION=gnome-classic

Gnome Classic(无效果)

  • XDG_CURRENT_DESKTOP=GNOME
  • GDMSESSION=gnome-fallback

其他基于Ubuntu的发行版


薄荷13(肉桂)

  • XDG_CURRENT_DESKTOP=GNOME
  • GDMSESSION=cinnamon

薄荷16(KDE版)

  • XDG_CURRENT_DESKTOP=KDE
  • GDMSESSION=default

薄荷17(肉桂)

  • XDG_CURRENT_DESKTOP=X-Cinnamon
  • GDMSESSION=default

鲁本图12.04

  • XDG_CURRENT_DESKTOP=LXDE
  • GDMSESSION=Lubuntu

瓦斯塔 14.04 / 18.04

  • XDG_CURRENT_DESKTOP=X-Cinnamon
  • GDMSESSION=cinnamon

使用Gnome桌面的Wasta 14.04。

  • XDG_CURRENT_DESKTOP=GNOME
  • GDMSESSION=gnome

Ubuntu Mate 18.04

  • XDG_CURRENT_DESKTOP=MATE
  • GDMSESSION=mate

徐邦图18.04

  • XDG_CURRENT_DESKTOP=XFCE
  • GDMSESSION=xubuntu

4
薄荷13(肉桂):XDG_CURRENT_DESKTOP = GNOME,GDMSESSION =肉桂
rik-shaw 2012年

1
鲁本图12.04:XDG_CURRENT_DESKTOP = LXDE,GDMSESSION =
鲁本图

$ DESKTOP_SESSION呢?作为备用解决方案:)
Savvas Radevic

1
如果我不使用GDM怎么办?
罗伯特·西默

6
而且,它不能回答我使用的窗口管理器
罗伯特·西默

42

在终端类型env中查看所有环境变量。他们之中有一些是:

XDG_CURRENT_DESKTOP-告诉您所使用的桌面环境

GDMSESSION-告诉您从lightdm迎宾员选择的登录选项。

要使用它们,请在终端上输入:

echo $XDG_CURRENT_DESKTOP

(如果使用Unity,将输出例如“ unity”)

要么

echo $GDMSESSION  

(如果您在登录名中选择了ubuntu,将输出例如“ ubuntu”,如果在登录名中选择了它,则将输出“ ubuntu-2d”。)

如果您更仔细地观察env类似DESKTOP_SESSIONCOMPIZ_CONFIG_PROFILE的输出,则还有其他问题

由于您要查找的是正在使用的Window Manager的名称,因此,我看到此方法的唯一方法是查看进程列表。为此,有一个名为pgrepWikipedia)的命令。我执行以下操作来获取名称,因为参数-l添加了进程ID:

pgrep -l compiz |cut -d " " -f2由于该进程由同一用户运行,因此无需在sudo部分添加前缀。然后,您可以使用它来创建一个脚本,该脚本基于“窗口管理器”执行操作。

为了寻找其他类型的,只是换个词compiz到另一个像mutterkwin等等。


2
那些只是告诉我会话名称和桌面环境。例如,它说“ GNOME”,这是一个可以使用Metacity,Mutter,Compiz或其他窗口管理器的桌面环境。它说“ gnome-classic”是一个会话名称,没有使用该名称的窗口管理器。
匿名

1
妳去 找到了可以帮助处理列表的命令。pgrep。转到该部分,至少可以找到找到的窗口管理器名称。尝试检查是否可以将所有这些都添加到那里。您的问题非常好,因为Ubuntu 11.10通过使用Compiz引起了一些混乱(如果在Gnome 3.x时会喃喃自语),那么指出在Unity中使用的实际Window Manager会很高兴。
Luis Alvarado

$XDG_CURRENT_DESKTOP是当前的桌面环境,而不是窗口管理器。
肯·夏普

24

我发现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}]

1
这让我有了自定义的buildroot系统。
jc__

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

1
您能解释一下这是如何工作的吗?另外,我认为您)最后缺少一个。
Louis Matthijssen 2014年

@LouisMatthijssen 1. xprop -root -notype显示所有根窗口的属性(并省略类型以简化解析),输出awk通过管道发送到;2. awk指令$1=="_NET[blah]CK:"{print $5}'将通过管道获得的输入的每一行的第一列与给定的字符串进行比较,如果找到匹配的内容,则运行括号中的代码,该代码将打印出该行的第五列-发生这种情况(完全是偶然的,我打赌)是“ _NET_SUPPORTING_WM_CHECK”原子的ID;3.然后使用此ID通过xprop -id
cprn

4

我也在KDE进行测试,得出的结论是:

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

b)中的命令行,用这个命令:ps -A | egrep -i "gnome|kde|mate|cinnamon|lx|xfce|jwm"。出现在更多行中的项目应该是答案(如果有平局,则带有“会话”的项目应该是解决方案)。


XFCE也有几个gnome-...过程(并打了一个kde kdevtmpfs
Xen2050 '16

2

上面的方法对我都不起作用,我只是想知道我是否在当前的桌面会话中运行了Gnome。

这是行得通的,打开一个终端

lsb_release -a

(检查我的UBUNTU计算机上安装了哪种口味或版本)

ls /usr/bin/*session

(启动当前使用的桌面会话/桌面环境)

gnome-shell --version 

(以找出安装了哪个版本的gnome)


1
#! /bin/bash
#  (GPL3+) Alberto Salvia Novella (es20490446e.wordpress.com)


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

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


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 | 切--delimiter ='“'--fields = 2


0

使用dbus和Accounts Service(这在Ubuntu中都是默认设置)是可行的。

$ qdbus --system org.freedesktop.Accounts \                                                                
> /org/freedesktop/Accounts/User1000 \                                                                                     
> org.freedesktop.Accounts.User.XSession                                                                                   
ubuntu

值得注意的是,我已经通过lightdm(即图形登录屏幕)登录进行了测试,它确实检测到了经典的桌面(如blackbox),并且显然检测到Unity。我怀疑这是用户在登录屏幕上选择的会话的值,这就是为什么使用检查流程要容易一些的原因


0

脚本

以下脚本是对我在unix.se上发布的类似问题的最佳答案。它也可以与Unity和LXDE一起使用。

if [ "$XDG_CURRENT_DESKTOP" = '' ]
then
  desktop=$(echo "$XDG_DATA_DIRS" | sed 's/.*\(xfce\|kde\|gnome\).*/\1/')
else
  desktop=$XDG_CURRENT_DESKTOP
fi

desktop=${desktop,,}  # convert to lower case
echo "$desktop"

0

您可以使用名为的工具inxi。可以通过以下方式从Ubuntu存储库获得:

sudo apt install inxi

或来自github:https : //github.com/smxi/inxi

只需运行以下命令:

inxi -Sx
System:    Host: blackhole Kernel: 5.1.15-050115-lowlatency x86_64 bits: 64 compiler: gcc v: 8.3.0
           Desktop: i3 4.16.1-178-g31c0f1b8 Distro: Ubuntu 19.04 (Disco Dingo)

注意Desktop: i3零件。就我而言,我使用的窗口管理器是i3

选项-S显示系统信息并x添加有关窗口管理器的信息。


-3

我只能想到在运行的进程中检查已知的窗口管理器。gconf中曾经有一个设置为首选窗口管理器的密钥,但是自Gnome 2.12开始不推荐使用。

因此,如果这是出于编程目的,建议您针对所有linux窗口管理器进行研究。一些受欢迎的是:

  • 侏儒壳*
  • Compiz
  • 元性
  • 喃喃自语
  • 锯鱼

您将必须使用命令对每个命令进行检查pgrep -l $WINDOW_MANAGER,其中$WINDOW_MANAGER您要检查的窗口管理器的名称是。该pgrep命令检查正在运行的进程。

我不确定100%是否将Gnome Shell视为窗口管理器;我从/usr/bin/gnome-wm脚本列表中获得的其余窗口管理器。该脚本实际上应该是可用的(因为它存在于全新安装中),但在我来说,它试图运行compiz的不是我的默认窗口管理器(不在我的Gnome会话中)。

编辑:

@Anarci的评论似乎更准确。就我而言,它确实显示了gnome-shell


1
似乎pgrep支持正则表达式,因此可以使用具有交替形式的模式。pgrep -l "compiz|metacity|mutter|kwin|sawfish|fluxbox|openbox|xmonad"
匿名

1
这还不够:如果用户与不同的管理员运行多个X会话怎么办?您至少应该检查窗口管理器是否在您感兴趣的显示器上运行(可以通过检查$DISPLAY其环境来做到这一点)。
吉尔斯

Ubuntu 18.04 LTS桌面:Unity:Unity7:ubuntu会话:Unity
user2584621
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.