如何确定正在运行的窗口管理器
是否有任何方法(例如命令或环境变量)来确定哪个窗口管理器是在当前会话中主动运行的窗口管理器 ?
如果你安装了wmctrl
,那么命令的第一行输出
wmctrl -m
将显示窗口管理器的名称。 如果您没有安装wmctrl
,请使用以下命令进行安装:
sudo apt-get install wmctrl
注意, man wmctrl
(也就是man wmctrl
的man
页)部分说:
-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-2d
和echo $XDG_CURRENT_DESKTOP
显示Unity
。
在旧笔记本电脑上安装新的Ubuntu 15.10 Ubuntu desktop
软件时, wmctrl -m
的第一行输出是: Name: Compiz
而DESKTOP_SESSION
和XDG_CURRENT_DESKTOP
值是ubuntu
和Unity
在Linux系统上,我测试了环境变量XDG_CURRENT_DESKTOP
和GDMSESSION
,得到了以下结果。
您可以使用此行来获取输出:
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
团结与Mir一起运行
-
XDG_CURRENT_DESKTOP=Unity
-
GDMSESSION=ubuntu
注意MIR_SERVER_NAME也已设置
-
MIR_SERVER_NAME=session-$NUMBER
Unity没有Mir运行
-
XDG_CURRENT_DESKTOP=Unity
-
GDMSESSION=ubuntu
XFCE
-
XDG_CURRENT_DESKTOP=XFCE
-
GDMSESSION=xfce
Ubuntu 12.04
KDE
-
XDG_CURRENT_DESKTOP=
-
GDMSESSION=kde-plasma
团结3d
-
XDG_CURRENT_DESKTOP=Unity
-
GDMSESSION=ubuntu
Unity 2d
-
XDG_CURRENT_DESKTOP=Unity
-
GDMSESSION=ubuntu-2d
地精
-
XDG_CURRENT_DESKTOP=GNOME
-
GDMSESSION=gnome-shell
Gnome Classic
-
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
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
在终端类型env
中查看所有环境变量。 他们之中有一些是:
XDG_CURRENT_DESKTOP – 告诉您正在使用的桌面环境
GDMSESSION – 告诉您从lightdm greeter中选择的选项以进行登录。
要使用它们,请转到终端并键入:
echo $XDG_CURRENT_DESKTOP
(如果使用Unity,将输出例如’unity’)
要么
echo $GDMSESSION
(如果您在登录中选择了ubuntu,则输出例如’ubuntu’,如果您在登录中选择了ubuntu,则输出’ubuntu-2d’。)
如果你仔细观察像DESKTOP_SESSION和COMPIZ_CONFIG_PROFILE这样的env
的输出,你还有其他人
因为您正在寻找的是Window Manager正在使用的名称,所以我看到如何获得这个的唯一方法是查看进程列表。 要做到这一点,有一个名为pgrep
( 维基百科 )的命令。 我执行以下操作来获取名称,因为参数-l添加了进程ID:
pgrep -l compiz |cut -d " " -f2
因为进程由同一个用户运行,所以不需要为sudo部分添加前缀。 然后,您可以使用此脚本创建基于Window Manager执行操作的脚本。
要查找其他类型,只需将单词compiz
更改为另一个类似mutter
, kwin
等。
我发现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}]
xprop -id $(xprop -root -notype | awk '$1=="_NET_SUPPORTING_WM_CHECK:"{print $5}') -notype -f _NET_WM_NAME 8t
我一直在测试KDE,我的结论是:
a)图形方式,使用HardInfo:答案通常在“操作系统”>“桌面环境”中,但如果不是,则可以查看“环境变量”。 HardInfo已经准备好了所有经过测试的发行版,除了使用KDE的发行版之外,它可以轻松快速地安装(Linux Mint 13中只有2个软件包)。
b)命令行,使用以下命令: ps -A | egrep -i "gnome|kde|mate|cinnamon|lx|xfce|jwm"
ps -A | egrep -i "gnome|kde|mate|cinnamon|lx|xfce|jwm"
。 出现在更多行中的项目应该是答案(如果有绘图,则具有“会话”的项目应该是解决方案)。
以上这些都不适合我,我只是想知道我是否将Gnome作为我当前的桌面会话运行。
这是有效的,打开一个终端
lsb_release -a
(检查我在UBUNTU机器上安装的风味或版本)
ls /usr/bin/*session
(启动当前正在使用的桌面会话/桌面环境)
gnome-shell --version
(找出安装了哪个版本的gnome)
以下脚本是我在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"
使用dbus和Accounts Service(默认情况下在Ubuntu中)都可以实现这一点。
$ qdbus --system org.freedesktop.Accounts \ > /org/freedesktop/Accounts/User1000 \ > org.freedesktop.Accounts.User.XSession ubuntu
值得注意的是,我通过lightdm(即图形登录屏幕)登录进行了测试,它确实检测到了像blackbox这样的经典桌面,并且显然检测到了Unity。 我怀疑这是用户在登录屏幕上选择的会话值,这就是为什么使用检查流程更容易的原因
我只能想到在正在运行的进程中检查已知的窗口管理器。 曾经有一个设置为首选窗口管理器的gconf中的密钥,但是自Gnome 2.12以来它已被弃用。
所以,如果这是出于编程目的,我建议你研究一下所有的linux窗口管理器; 一些流行的是:
- GNOME壳*
- Compiz的
- 的metacity
- 咕哝
- 锯鳐
您必须使用命令pgrep -l $WINDOW_MANAGER
为每个运行检查,其中$WINDOW_MANAGER
是您要检查的窗口管理器的名称。 pgrep
命令检查正在运行的进程。
如果Gnome Shell被视为窗口管理员,我不是100%肯定; 我从/usr/bin/gnome-wm
脚本中的列表中获取的其余窗口管理器。 事实上这个脚本应该是可用的(因为它在干净安装时出现),但在我的情况下,它试图运行compiz
,这不是我的默认窗口管理器(不在我的Gnome会话中)。
编辑:
那么@Anarci的评论似乎更准确。 在我的情况下它确实显示了gnome-shell
。