Cách xác định trình quản lý cửa sổ nào đang chạy


180

Có cách nào (chẳng hạn như một lệnh hoặc biến môi trường) để xác định trình quản lý cửa sổ nào đang chạy tích cực trong phiên hiện tại không?

Câu trả lời:


145

Nếu bạn đã wmctrlcài đặt, dòng đầu ra đầu tiên từ lệnh

    wmctrl -m

sẽ cho bạn thấy tên của người quản lý cửa sổ. Nếu bạn chưa wmctrlcài đặt, hãy sử dụng lệnh sau để cài đặt nó:

    sudo apt-get install wmctrl

Lưu ý, man wmctrl(có nghĩa là, mantrang cho wmctrl) nói một phần:

-m Hiển thị thông tin về trình quản lý cửa sổ ...

Trên hệ thống Ubuntu 11.10 / Linux 3.0.0-14-chung # 23-Ubuntu x86_64 / metacity 2.34.1 của tôi, dòng đầu ra đầu tiên từ wmctrl -mlà: Name: Metacity
trong khi echo $DESKTOP_SESSIONhiển thị ubuntu-2decho $XDG_CURRENT_DESKTOPhiển thị Unity.

Trên bản cài đặt Ubuntu desktopphần mềm Ubuntu 15.10 mới trên máy tính xách tay cũ, dòng đầu ra đầu tiên wmctrl -mlà: Name: Compiz
trong khi DESKTOP_SESSIONXDG_CURRENT_DESKTOPcác giá trị là ubuntuUnity


4
Thật không may, điều này không hoạt động trên ssh ngay cả khi X11 được bật.
Sridhar Sarnobat

1
@ Sridhar-Sarnobat trên Ubuntu 15.04, việc chạy ssh -Y {host} 'wmctrl -m'sẽ trả về một số giá trị (ví dụ: "Tên: Compiz" và một số N / A), nhưng điều đó có nghĩa là sshsẽ có thông tin hạn chế về trình quản lý cửa sổ.
michael

trên debian chạy quế, điều này không hoạt động. đầu ra của wmctrl -m là Tên: Mutter (Muffin) trong khi $ XDG_CURRENT_DESKTOP = X-Cinnamon
Floyd

Trên Xubfox Wily, chạy Window Maker 0.95.6 - wmctrl báo cáo N / A cho tất cả các mục. GDMSESSION được đặt thành wmaker-common nhưng XDG_CURRENT_DESKTOP hoàn toàn không được đặt.
Mei

@Mei, bạn có Window Maker chạy trên bất kỳ hệ thống nào khác mà bạn có thể so sánh không? Ngoài ra, liệu một trong hai wmctrl -d(Liệt kê tất cả các máy tính để bàn được quản lý bởi trình quản lý cửa sổ) hoặc wmctrl -l(Liệt kê các cửa sổ đang được quản lý cửa sổ quản lý) hoạt động tốt trên Xubfox Wily với Window Maker?
James Waldby - jwpat7

102

Trên các hệ thống Linux Tôi đã thử nghiệm biến môi trường XDG_CURRENT_DESKTOPGDMSESSIONvà nhận được kết quả như sau.

Bạn có thể sử dụng dòng này để có được đầu ra:

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

Ubuntu 18.04 (Ubuntu)

  • XDG_CURRENT_DESKTOP=ubuntu:GNOME
  • GDMSESSION=ubuntu

Ubuntu 18.04 (Ubuntu trên Wayland)

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

Ubuntu 16.04


Đoàn kết (7)

  • XDG_CURRENT_DESKTOP=Unity
  • GDMSESSION=ubuntu

Ubuntu 14.04


Đoàn kết chạy với Mir

  • XDG_CURRENT_DESKTOP=Unity
  • GDMSESSION=ubuntu

Lưu ý MIR_SERVER_NAME cũng được đặt

  • MIR_SERVER_NAME=session-$NUMBER

Đoàn kết chạy mà không có Mir

  • XDG_CURRENT_DESKTOP=Unity
  • GDMSESSION=ubuntu

XFCE

  • XDG_CURRENT_DESKTOP=XFCE
  • GDMSESSION=xfce

Ubuntu 12.04


KDE

  • XDG_CURRENT_DESKTOP=
  • GDMSESSION=kde-plasma

Đoàn kết 3d

  • XDG_CURRENT_DESKTOP=Unity
  • GDMSESSION=ubuntu

Đoàn kết 2d

  • XDG_CURRENT_DESKTOP=Unity
  • GDMSESSION=ubuntu-2d

Gnome

  • XDG_CURRENT_DESKTOP=GNOME
  • GDMSESSION=gnome-shell

Gnome cổ điển

  • XDG_CURRENT_DESKTOP=GNOME
  • GDMSESSION=gnome-classic

Gnome Classic (không có hiệu ứng)

  • XDG_CURRENT_DESKTOP=GNOME
  • GDMSESSION=gnome-fallback

Các bản phân phối dựa trên Ubuntu khác


Bạc hà 13 (quế)

  • XDG_CURRENT_DESKTOP=GNOME
  • GDMSESSION=cinnamon

Mint 16 (phiên bản KDE)

  • XDG_CURRENT_DESKTOP=KDE
  • GDMSESSION=default

Bạc hà 17 (quế)

  • XDG_CURRENT_DESKTOP=X-Cinnamon
  • GDMSESSION=default

Lubfox 12.04

  • XDG_CURRENT_DESKTOP=LXDE
  • GDMSESSION=Lubuntu

Wasta 14.04 / 18.04

  • XDG_CURRENT_DESKTOP=X-Cinnamon
  • GDMSESSION=cinnamon

Wasta 14.04 sử dụng máy tính để bàn Gnome.

  • XDG_CURRENT_DESKTOP=GNOME
  • GDMSESSION=gnome

Ubuntu Mate 18.04

  • XDG_CURRENT_DESKTOP=MATE
  • GDMSESSION=mate

Xubfox 18.04

  • XDG_CURRENT_DESKTOP=XFCE
  • GDMSESSION=xubuntu

4
Bạc hà 13 (Quế): XDG_CURRENT_DESKTOP = Gnome, GDMSESSION = quế
rik-Shaw

1
LubFi 12.04: XDG_CURRENT_DESKTOP = LXDE, GDMSESSION = Lubfox
rik-Shaw

Còn $ DESKTOP_SESSION thì sao? Là một giải pháp dự phòng :)
Savvas Radevic

1
Nếu tôi không sử dụng GDM thì sao?
Robert Siemer

6
Và hơn nữa nó không trả lời tôi sử dụng trình quản lý cửa sổ nào!
Robert Siemer

42

Trong các loại thiết bị đầu cuối envđể xem tất cả các biến môi trường. Một số trong số họ là:

XDG_CURRENT_DESKTOP - Cho bạn biết bạn đang sử dụng môi trường máy tính để bàn nào

GDMSESSION - Cho bạn biết tùy chọn nào bạn đã chọn từ trình chào mừng lightdm để đăng nhập.

Để sử dụng chúng, hãy đi đến thiết bị đầu cuối và gõ:

echo $XDG_CURRENT_DESKTOP

(Sẽ xuất ra ví dụ 'unity' nếu bạn đang sử dụng Unity)

hoặc là

echo $GDMSESSION  

(Sẽ xuất ra ví dụ 'ubfox' nếu bạn đã chọn ubfox trong thông tin đăng nhập hoặc 'ubfox-2d' nếu bạn chọn mục đó trong thông tin đăng nhập.)

Bạn có những người khác nếu bạn nhìn kỹ hơn vào đầu ra envnhư DESKTOP_SESSIONCOMPIZ_CONFIG_PROFILE

Vì những gì bạn đang tìm kiếm là tên của Window Manager đang sử dụng, cách duy nhất tôi thấy làm thế nào để có được điều này là bằng cách tìm trong danh sách quy trình. Để làm điều này, có một lệnh gọi là pgrep( Wikipedia ). Tôi đã làm như sau để có được tên vì tham số -l thêm ID tiến trình:

pgrep -l compiz |cut -d " " -f2do quá trình đang được chạy bởi cùng một người dùng nên không cần phải thêm tiền tố vào phần sudo. Sau đó, bạn có thể sử dụng điều này để tạo một tập lệnh thực hiện một hành động dựa trên Trình quản lý cửa sổ.

Để tìm kiếm các loại khác, chỉ cần thay đổi chữ compizkhác như mutter, kwin, vv ..


2
Những người chỉ cho tôi biết tên phiên và môi trường máy tính để bàn. Ví dụ, nó nói "Gnome", một môi trường máy tính để bàn có thể sử dụng Metacity, Mutter, Compiz hoặc các trình quản lý cửa sổ khác. Nó nói "gnome-classic" là tên phiên, không có trình quản lý cửa sổ nào có tên đó.
Ẩn danh

1
Có bạn đi. Tìm thấy một lệnh có thể giúp với danh sách quá trình. pgrep. Đến phần đó, ít nhất nó sẽ hiển thị cho bạn tên của trình quản lý cửa sổ nếu tìm thấy. Cố gắng kiểm tra xem tôi có thể thêm tất cả chúng lại với nhau ở đó không. Câu hỏi của bạn rất hay vì Ubuntu 11.10 gây nhầm lẫn một chút khi sử dụng Compiz (Hoặc lẩm bẩm nếu khi Gnome 3.x) vì vậy sẽ rất hay để chỉ ra Trình quản lý cửa sổ thực tế được sử dụng trong Unity.
Luis Alvarado

$XDG_CURRENT_DESKTOPlà môi trường máy tính để bàn hiện tại, KHÔNG phải là trình quản lý cửa sổ.
Ken Sharp

24

Tôi tìm thấy pstreemột sự giúp đỡ lớn.

Cài đặt

sudo apt-get install pstree

đầu ra

Đây là những gì tôi nhận được.

 ├─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
điều này đã đưa tôi đến đó với hệ thống buildroot tùy chỉnh của tôi.
jc__

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

1
Bạn có thể giải thích làm thế nào điều này hoạt động? Ngoài ra, tôi nghĩ rằng bạn đang thiếu một )cuối cùng.
Louis Matthijssen

@LouisMatthijssen 1. xprop -root -notypehiển thị tất cả các thuộc tính của cửa sổ gốc (và bỏ qua các loại để phân tích cú pháp dễ dàng hơn), đầu ra được gửi đến awkqua đường ống; 2. awkhướng dẫn $1=="_NET[blah]CK:"{print $5}'so sánh cột đầu tiên của mỗi hàng của đầu vào mà nó đã đi qua ống với một chuỗi đã cho và nếu tìm thấy kết quả khớp, nó sẽ chạy mã trong ngoặc in cột thứ năm từ hàng này - hoàn toàn ngẫu nhiên (hoàn toàn tình cờ, Tôi đặt cược) là ID của nguyên tử "_NET_SUPPORTING_WM_CHECK"; 3. ID này sau đó được sử dụng lại để lấy các thuộc tính của Trình quản lý Windows vớixprop -id
cprn

4

Tôi cũng đã thử nghiệm với KDE và kết luận của tôi là:

a) Cách đồ họa, với HardInfo: câu trả lời thường có trong "Hệ điều hành"> "Môi trường máy tính để bàn", nhưng nếu không, bạn có thể tìm đến "Biến môi trường". HardInfo đã sẵn sàng với tất cả các bản phát hành được thử nghiệm, ngoại trừ bản phân phối có KDE, nhưng nó có thể được cài đặt dễ dàng và nhanh chóng (chỉ có 2 gói trong Linux Mint 13).

b) Dòng lệnh, với lệnh này : ps -A | egrep -i "gnome|kde|mate|cinnamon|lx|xfce|jwm". Mục xuất hiện trong nhiều dòng hơn sẽ là câu trả lời (nếu có một mục rút ra với "phiên" sẽ là giải pháp).


XFCE cũng có một số gnome-...quy trình (và một kde hit với kdevtmpfs)
Xen2050

2

Không có cái nào ở trên thực sự hiệu quả với tôi, tôi chỉ muốn biết liệu tôi có Gnome chạy như phiên máy tính để bàn hiện tại của tôi không.

Đây là những gì đã làm việc, mở một thiết bị đầu cuối

lsb_release -a

(để kiểm tra hương vị hoặc phiên bản nào tôi đã cài đặt trên máy UBUNTU của mình)

ls /usr/bin/*session

(khởi chạy phiên môi trường máy tính để bàn / môi trường máy tính để bàn hiện đang sử dụng)

gnome-shell --version 

(để tìm ra phiên bản gnome nào được cài đặt)


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

Hoặc trong một dòng:

id = $ (xprop -root -notype | awk '$ 1 == "_ NET_SUPPORTING_WM_CHECK:" {in $ 5}'); xprop -id "$ {id}" -notype -f _NET_WM_NAME 8t | grep "_NET_WM_NAME =" | cắt --d006iter = '' --fields = 3 | cắt --d006iter = '"' --fields = 2


0

Đây là loại có thể với dbus và Dịch vụ tài khoản (cả hai theo mặc định trong Ubuntu).

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

Đáng chú ý là tôi đã thử nghiệm điều này bằng cách đăng nhập thông qua lightdm (đó là màn hình đăng nhập đồ họa), nó đã phát hiện một máy tính để bàn cổ điển như hộp đen và rõ ràng phát hiện ra Unity. Tôi nghi ngờ đây là giá trị của những gì người dùng chọn trên màn hình đăng nhập dưới dạng phiên, đó là lý do tại sao việc sử dụng kiểm tra các quy trình dễ dàng hơn một chút


0

Kịch bản

Các kịch bản sau đây kết quả là câu trả lời tốt nhất cho một tương tự câu hỏi tôi gửi qua tại unix.se . Nó cũng hoạt động tuyệt vời với Unity và 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

Bạn có thể sử dụng công cụ được gọi là inxi. Nó có thể được lấy từ kho Ubuntu bằng cách:

sudo apt install inxi

hoặc từ github: https://github.com/smxi/inxi

Chỉ cần chạy lệnh như sau:

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)

Lưu ý Desktop: i3một phần. Trong trường hợp của tôi, trình quản lý cửa sổ tôi sử dụng là i3.

Tùy chọn -Shiển thị thông tin hệ thống và xthêm thông tin về trình quản lý cửa sổ.


-3

Tôi chỉ có thể nghĩ đến việc kiểm tra các trình quản lý cửa sổ đã biết trong các quy trình đang chạy. Đã từng có một khóa trong gconf được đặt thành trình quản lý cửa sổ ưa thích, nhưng nó không dùng nữa kể từ Gnome 2.12.

Vì vậy, nếu điều này là cho mục đích lập trình, tôi khuyên bạn nên nghiên cứu cho tất cả các trình quản lý cửa sổ linux; Một số phổ biến là:

  • vỏ gnome *
  • công ty
  • độ bền
  • lẩm bẩm
  • cá cưa

Bạn sẽ phải chạy một kiểm tra cho từng lệnh pgrep -l $WINDOW_MANAGER, đây $WINDOW_MANAGERlà tên của trình quản lý cửa sổ mà bạn muốn kiểm tra. Các pgrepkiểm tra lệnh cho tiến trình đang chạy.

Tôi không chắc chắn 100% nếu Gnome Shell được coi là người quản lý cửa sổ; phần còn lại của các trình quản lý cửa sổ tôi nhận được từ một danh sách trong /usr/bin/gnome-wmtập lệnh. Tập lệnh này trong thực tế nên có thể sử dụng được (vì nó có trong bản cài đặt sạch) nhưng trong trường hợp của tôi, nó cố gắng chạy compizmà không phải là trình quản lý cửa sổ mặc định của tôi (không phải trong phiên Gnome của tôi).

BIÊN TẬP:

Vâng, nhận xét của @Anarci dường như chính xác hơn. Trong trường hợp của tôi, nó đã hiển thị gnome-shell.


1
Có vẻ như pgrep hỗ trợ regex nên có thể sử dụng một mẫu có xen kẽ. pgrep -l "compiz|metacity|mutter|kwin|sawfish|fluxbox|openbox|xmonad"
Ẩn danh

1
Điều đó là không đủ: nếu người dùng đang chạy một vài phiên X với những người quản lý khác nhau thì sao? Ít nhất bạn nên kiểm tra xem trình quản lý cửa sổ hoạt động trên màn hình mà bạn quan tâm (bạn có thể làm điều đó bằng cách kiểm tra $DISPLAYtrong môi trường của nó).
Gilles

Ubuntu 18.04 LTS Máy tính để bàn: Unity: Unity7: ub Ubuntu Phiên: unity
user2584621
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.