在目前使用者的非互動式 shell 中找到目前 DISPLAY 和 XAUTHORITY 的最佳方法是什麼?
我有一個項目需要檢測
DISPLAY
in shell ( bash ) 變數,以便能夠在本地機器上顯示一些gui內容。或者更好的解決方案(dbus?)在非互動式 shell 中打開gui的東西,而不用試圖找出
DISPLAY
和XAUTHORITY
.我可以設置
DISPLAY=:0
,但如果使用者使用另一個會話,這將失敗。就我不處於互動模式而言,我嘗試過的(效果很好,但只能作為 root)是:
strings /proc/$(pidof Xorg)/environ | grep -Eo 'DISPLAY=:[0-9]+(:[0-9])*'
或作為使用者:
ps uww $(pidof Xorg) | grep -oE '[[:blank:]]:[0-9]+(:[0-9])*\b'
但我不知道它在任何 Linux(Unix 系統?)上是否可靠
有沒有更可靠/便攜的方式?
最終解決方案不需要 root 使用者,並且可以從非互動式 shell 以自動化方式訪問,並且比之前提供的可能的重複連結更先進和可用:
-
XAUTHORITY
:ps -u $(id -u) -o pid= | xargs -I{} cat /proc/{}/environ 2>/dev/null | tr '\0' '\n' | grep -m1 '^XAUTHORITY='
DISPLAY
:ps -u $(id -u) -o pid= | xargs -I{} cat /proc/{}/environ 2>/dev/null | tr '\0' '\n' | grep -m1 '^DISPLAY='
該片段列出了所有使用者的
pids
,遍歷它們,然後在第一個匹配時中斷基於此
在具有 init 系統
systemd
的發行版上,輸出systemctl --user show-environment
顯示
DISPLAY
和XAUTHORITY
。gdm3
對於我的帶有 systemd 並作為顯示管理器的 debian 9 系統來說,這至少是正確的。陷阱:在
startx xterm -- :2 vt2
tty2 上執行後 systemctl 給了我DISPLAY
並XAUTHORITY
從新顯示;我的主顯示器:0
不再以這種方式被觀察到。其他方法:
至少解析輸出並查找 option
XAUTHORITY
更可靠。就我而言,它位於而不是位於。ps aux | grep Xorg``-auth``/run/user/1000/gdm/Xauthority``~/.Xauthority
陷阱:
- 可以有多個 Xorg 實例。
- 代替 Xorg 可以有
Xwayland
.- 除了 Xorg 之外,還可以有
Xvfb
其他東西。- 它可能是一個根本沒有本地 Xorg 的遠端會話。
通常
Xorg
命令還包含顯示編號。不幸的是,我的沒有:/usr/lib/xorg/Xorg vt1 -displayfd 3 -auth /run/user/1000/gdm/Xauthority -background none -noreset -keeptty -verbose 3
-displayfd 3
不知何故指向DISPLAY
. 如果以 root 身份查看/proc/$(pidof Xorg)/fd/3
我發現lrwx------ 1 root root 64 Mär 8 22:45 3 -> socket:[21437]
雖然,我不知道如何尋找 socket
21437
。我確信它指向/tmp/.X11-unix/X0
. 一種方法是lsof +E -aUc Xorg
顯示有趣的輸出:包含許多連接@/tmp/.X11-unix/X0
和一個dbus
連接。有點臟:
fd
文件夾也顯示了我l-wx------ 1 root root 64 Mär 8 22:45 5 -> /var/log/Xorg.0.log
Xorg.0.log
是一個明確的顯示指示:0
。另一種方法:
notify-send
似乎聚集DISPLAY
並XAUTHORITY
帶有一些dbus
魔力。但我不知道如何。如果至少有一個 dbus 守護程序正在執行,那麼這可能是最乾淨和最便攜的方式。