มีวิธีใดบ้าง (เช่นคำสั่งหรือตัวแปรสภาวะแวดล้อม) เพื่อพิจารณาว่าตัวจัดการหน้าต่างคืออะไรที่ทำงานอยู่ในเซสชันปัจจุบันหรือไม่?
มีวิธีใดบ้าง (เช่นคำสั่งหรือตัวแปรสภาวะแวดล้อม) เพื่อพิจารณาว่าตัวจัดการหน้าต่างคืออะไรที่ทำงานอยู่ในเซสชันปัจจุบันหรือไม่?
คำตอบ:
หากคุณwmctrlติดตั้งแล้วบรรทัดแรกของเอาต์พุตจากคำสั่ง
wmctrl -m
จะแสดงชื่อผู้จัดการหน้าต่าง หากคุณยังไม่ได้wmctrlติดตั้งให้ใช้คำสั่งต่อไปนี้เพื่อติดตั้ง:
sudo apt-get install wmctrl
หมายเหตุman wmctrl(นั่นคือmanหน้าสำหรับwmctrl) กล่าวในส่วน:
-m แสดงข้อมูลเกี่ยวกับเครื่องมือจัดการหน้าต่าง ...
บน Ubuntu 11.10 ของฉัน / Linux 3.0.0-14 ทั่วไป # 23 อูบุนตู x86_64 / Metacity 2.34.1 ระบบบรรทัดแรกของผลลัพธ์จากwmctrl -mถูก: Name: Metacity
ในขณะที่echo $DESKTOP_SESSIONแสดงให้เห็นubuntu-2dและแสดงให้เห็นว่าecho $XDG_CURRENT_DESKTOPUnity
บน Ubuntu 15.10 ที่เพิ่งติดตั้งUbuntu desktopซอฟต์แวร์ใหม่บนแล็ปท็อปเก่าบรรทัดแรกของผลลัพธ์wmctrl -mคือ: Name: Compiz
ในขณะที่DESKTOP_SESSIONและXDG_CURRENT_DESKTOPค่าต่าง ๆubuntuและUnity
ssh -Y {host} 'wmctrl -m'จะส่งคืนค่าบางค่า (เช่น "ชื่อ: Compiz" และหลาย N / A) แต่มันสมเหตุสมผลที่sshจะมีข้อมูล จำกัด เกี่ยวกับตัวจัดการหน้าต่าง
wmctrl -d(แสดงรายการเดสก์ท็อปทั้งหมดที่จัดการโดยตัวจัดการหน้าต่าง) หรือ wmctrl -l(แสดงรายการหน้าต่างที่จัดการโดยตัวจัดการหน้าต่าง) ทำงานได้ดีบน Xubuntu Wily กับ Window Maker หรือไม่
บนระบบลินุกซ์ผมทดสอบตัวแปรสภาพแวดล้อมXDG_CURRENT_DESKTOPและGDMSESSIONและได้ผลดังต่อไปนี้
คุณสามารถใช้บรรทัดนี้เพื่อรับเอาต์พุต:
printf 'Desktop: %s\nSession: %s\n' "$XDG_CURRENT_DESKTOP" "$GDMSESSION"
XDG_CURRENT_DESKTOP=ubuntu:GNOMEGDMSESSION=ubuntuXDG_CURRENT_DESKTOP=ubuntu:GNOMEGDMSESSION=ubuntu-waylandXDG_CURRENT_DESKTOP=UnityGDMSESSION=ubuntuXDG_CURRENT_DESKTOP=UnityGDMSESSION=ubuntuหมายเหตุ MIR_SERVER_NAME ถูกตั้งค่าด้วย
MIR_SERVER_NAME=session-$NUMBERXDG_CURRENT_DESKTOP=UnityGDMSESSION=ubuntuXDG_CURRENT_DESKTOP=XFCEGDMSESSION=xfceXDG_CURRENT_DESKTOP=GDMSESSION=kde-plasmaXDG_CURRENT_DESKTOP=UnityGDMSESSION=ubuntuXDG_CURRENT_DESKTOP=UnityGDMSESSION=ubuntu-2dXDG_CURRENT_DESKTOP=GNOMEGDMSESSION=gnome-shellXDG_CURRENT_DESKTOP=GNOMEGDMSESSION=gnome-classicXDG_CURRENT_DESKTOP=GNOMEGDMSESSION=gnome-fallbackXDG_CURRENT_DESKTOP=GNOMEGDMSESSION=cinnamonXDG_CURRENT_DESKTOP=KDEGDMSESSION=defaultXDG_CURRENT_DESKTOP=X-CinnamonGDMSESSION=defaultXDG_CURRENT_DESKTOP=LXDE GDMSESSION=LubuntuXDG_CURRENT_DESKTOP=X-Cinnamon GDMSESSION=cinnamonXDG_CURRENT_DESKTOP=GNOME GDMSESSION=gnomeXDG_CURRENT_DESKTOP=MATEGDMSESSION=mateXDG_CURRENT_DESKTOP=XFCEGDMSESSION=xubuntuในประเภทอาคารenvเพื่อดูตัวแปรสภาพแวดล้อมทั้งหมด บางส่วนของพวกเขาคือ:
XDG_CURRENT_DESKTOP - บอกให้คุณทราบถึงสภาพแวดล้อมของเดสก์ท็อปที่คุณใช้
GDMSESSION - บอกสิ่งที่คุณเลือกจากตัวเลือก lightdm greeter เพื่อเข้าสู่ระบบ
หากต้องการใช้งานให้ไปที่เทอร์มินัลแล้วพิมพ์:
echo $XDG_CURRENT_DESKTOP
(จะแสดงผลตัวอย่างเช่น 'unity' หากคุณใช้ Unity)
หรือ
echo $GDMSESSION
(จะแสดงผลตัวอย่างเช่น 'ubuntu' หากคุณเลือก ubuntu ในการเข้าสู่ระบบหรือ 'ubuntu-2d' หากคุณเลือกไว้ในการเข้าสู่ระบบ)
คุณมีคนอื่น ๆ ถ้าคุณดูผลลัพธ์ของenvเช่นDESKTOP_SESSIONและCOMPIZ_CONFIG_PROFILE ให้ละเอียดยิ่งขึ้น
เนื่องจากสิ่งที่คุณกำลังมองหาคือชื่อของตัวจัดการหน้าต่างที่ใช้งานวิธีเดียวที่ฉันเห็นวิธีรับคือโดยดูในรายการกระบวนการ การทำเช่นนี้มีคำสั่งที่เรียกว่าpgrep( Wikipedia ) ฉันทำต่อไปนี้เพื่อรับชื่อเนื่องจากพารามิเตอร์ -l เพิ่ม ID กระบวนการ:
pgrep -l compiz |cut -d " " -f2ตั้งแต่กระบวนการกำลังทำงานโดยผู้ใช้เดียวกันไม่จำเป็นต้องนำหน้าส่วน sudo จากนั้นคุณสามารถใช้สิ่งนี้เพื่อสร้างสคริปต์ที่ดำเนินการตาม Window Manager
ที่จะมองหาประเภทอื่น ๆ เพียงแค่เปลี่ยนคำcompizไปยังอีกเช่นmutter, kwinฯลฯ ..
$XDG_CURRENT_DESKTOPเป็นสภาพแวดล้อมเดสก์ทอปปัจจุบันไม่ใช่ตัวจัดการหน้าต่าง
ฉันพบว่า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
)ในตอนท้าย
xprop -root -notypeแสดงคุณสมบัติทั้งหมดของหน้าต่างรูต (และละเว้นประเภทสำหรับการแยกวิเคราะห์ได้ง่ายขึ้น) เอาต์พุตจะถูกส่งไปยังawkผ่านไพพ์ 2. awkคำสั่ง$1=="_NET[blah]CK:"{print $5}'เปรียบเทียบคอลัมน์แรกของแต่ละแถวของอินพุตที่ได้รับผ่านไปป์กับสตริงที่กำหนดและหากพบการจับคู่จะรันโค้ดในวงเล็บซึ่งพิมพ์คอลัมน์ที่ห้าจากแถวนี้ - เกิดขึ้นโดยบังเอิญ ฉันเดิมพัน) เพื่อเป็น ID ของอะตอม "_NET_SUPPORTING_WM_CHECK" 3. ID นี้จะถูกใช้อีกครั้งเพื่อรับคุณสมบัติของตัวจัดการ Windows ด้วยxprop -id
ฉันได้ทำการทดสอบกับ KDE ด้วยและข้อสรุปของฉันคือ:
a) วิธีกราฟิกกับ HardInfo: คำตอบอยู่ใน "ระบบปฏิบัติการ"> "สภาพแวดล้อมของเดสก์ท็อป" แต่ถ้าไม่ใช่คุณสามารถดูที่ "ตัวแปรสภาพแวดล้อม" HardInfo พร้อมกับ distros ที่ทดสอบแล้วทั้งหมดยกเว้นอันที่มี KDE แต่สามารถติดตั้งได้ง่ายและรวดเร็ว (เพียง 2 แพ็คเกจใน Linux Mint 13)
ข) ps -A | egrep -i "gnome|kde|mate|cinnamon|lx|xfce|jwm"บรรทัดคำสั่งด้วยคำสั่งนี้: รายการที่ปรากฏในบรรทัดเพิ่มเติมควรเป็นคำตอบ (หากมีการวาดรายการที่มี "เซสชั่น" ควรเป็นทางออก)
gnome-...กระบวนการหลายขั้นตอน (และ kde hit ด้วยkdevtmpfs)
ข้างต้นไม่ได้ผลสำหรับฉันฉันแค่อยากจะรู้ว่าฉันใช้ Gnome เป็นเซสชันเดสก์ท็อปปัจจุบันของฉันหรือไม่
นี่คือสิ่งที่ทำงานได้เปิดเทอร์มินัล
lsb_release -a
(เพื่อตรวจสอบว่าฉันได้ติดตั้งรสชาติหรือรุ่นใดบนเครื่อง UBUNTU ของฉัน)
ls /usr/bin/*session
(เปิดใช้เซสชันเดสก์ท็อป / สภาพแวดล้อมเดสก์ท็อปที่ใช้งานอยู่)
gnome-shell --version
(เพื่อดูว่ามีการติดตั้ง gnome รุ่นใด)
#! /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:" {พิมพ์ $ 5}'); xprop -id "$ {id}" -notype -f _NET_WM_NAME 8t | grep "_NET_WM_NAME =" | ตัด --delimiter = '' - ฟิลด์ = 3 | cut --delimiter = '"' - ฟิลด์ = 2
สิ่งนี้สามารถจัดทำได้ด้วย dbus และ Accounts (ทั้งสองค่าเริ่มต้นใน Ubuntu)
$ qdbus --system org.freedesktop.Accounts \
> /org/freedesktop/Accounts/User1000 \
> org.freedesktop.Accounts.User.XSession
ubuntu
น่าสังเกตว่าฉันได้ทดสอบสิ่งนี้ด้วยการเข้าสู่ระบบผ่าน lightdm (นั่นคือหน้าจอเข้าสู่ระบบแบบกราฟิก) มันตรวจจับเดสก์ท็อปแบบคลาสสิคเช่น blackbox และตรวจจับ Unity อย่างชัดเจน ฉันสงสัยว่านี่เป็นค่าของสิ่งที่ผู้ใช้เลือกบนหน้าจอการเข้าสู่ระบบเป็นเซสชันนั่นเป็นเหตุผลว่าทำไมการใช้กระบวนการตรวจสอบกระบวนการจึงง่ายขึ้นเล็กน้อย
สคริปต์ต่อไปนี้ส่งผลให้เป็นคำตอบที่ดีที่สุดในการที่คล้ายกันคำถามที่ผมโพสต์มากกว่าที่ 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"
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เพิ่มข้อมูลเกี่ยวกับตัวจัดการหน้าต่าง
ฉันสามารถนึกถึงการตรวจสอบผู้จัดการหน้าต่างที่รู้จักในกระบวนการทำงาน เคยมีคีย์ใน gconf ที่ตั้งค่าเป็นตัวจัดการหน้าต่างที่ต้องการ แต่เลิกใช้แล้วตั้งแต่ Gnome 2.12
ดังนั้นหากนี่คือจุดประสงค์ในการเขียนโปรแกรมฉันขอแนะนำให้คุณศึกษาตัวจัดการหน้าต่าง linux ทั้งหมด ความนิยมคือ:
คุณจะต้องเรียกใช้การตรวจสอบสำหรับแต่ละคำสั่งpgrep -l $WINDOW_MANAGERโดยที่$WINDOW_MANAGERเป็นชื่อของตัวจัดการหน้าต่างที่คุณต้องการตรวจสอบ pgrepการตรวจสอบคำสั่งสำหรับกระบวนการทำงาน
ฉันไม่แน่ใจ 100% ว่า Gnome Shell เป็นตัวจัดการหน้าต่างหรือไม่ ส่วนที่เหลือของผู้จัดการหน้าต่างที่ฉันได้รับจากรายการใน/usr/bin/gnome-wmสคริปต์ อันที่จริงสคริปต์นี้ควรจะใช้งานได้ (ตั้งแต่มีอยู่ในการติดตั้งใหม่ทั้งหมด) แต่ในกรณีของฉันพยายามเรียกใช้compizซึ่งไม่ใช่ตัวจัดการหน้าต่างเริ่มต้นของฉัน (ไม่ใช่ในเซสชัน Gnome ของฉัน)
แก้ไข:
ความเห็นของ @Anarci ก็ดูเหมือนจะแม่นยำยิ่งขึ้น gnome-shellในกรณีของฉันมันไม่แสดง
pgrep -l "compiz|metacity|mutter|kwin|sawfish|fluxbox|openbox|xmonad"
$DISPLAYสภาพแวดล้อมของหน้าต่าง)