Gil*_*not 4 xorg x11 display variable
我有一个项目需要检测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])*'
Run Code Online (Sandbox Code Playgroud)
或作为用户:
ps uww $(pidof Xorg) | grep -oE '[[:blank:]]:[0-9]+(:[0-9])*\b'
Run Code Online (Sandbox Code Playgroud)
但我不知道它在任何 Linux(Unixes?)上是否可靠
有没有更可靠/便携的方式?
在带有 init 系统systemd
的发行版上,输出
systemctl --user show-environment
Run Code Online (Sandbox Code Playgroud)
显示DISPLAY
和XAUTHORITY
。对于我的带有 systemd 和gdm3
作为显示管理器的debian 9 系统来说,这至少是正确的。
陷阱:在startx xterm -- :2 vt2
tty2 systemctl 上运行后给我DISPLAY
和XAUTHORITY
从新显示;我的主显示器:0
不再以这种方式观察。
其他方法:
至少因为XAUTHORITY
解析输出ps aux | grep Xorg
并查找 option更可靠-auth
。在我的情况下,它位于/run/user/1000/gdm/Xauthority
而不是在~/.Xauthority
。
陷阱:
Xwayland
.Xvfb
或其他东西代替 Xorg 。通常Xorg
命令还包含显示编号。不幸的是,我的没有:
/usr/lib/xorg/Xorg vt1 -displayfd 3 -auth /run/user/1000/gdm/Xauthority -background none -noreset -keeptty -verbose 3
Run Code Online (Sandbox Code Playgroud)
-displayfd 3
不知何故指向DISPLAY
. 如果以 root 身份查看/proc/$(pidof Xorg)/fd/3
我发现
lrwx------ 1 root root 64 Mär 8 22:45 3 -> socket:[21437]
Run Code Online (Sandbox Code Playgroud)
虽然,我不知道如何寻找 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
Run Code Online (Sandbox Code Playgroud)
Xorg.0.log
是显示的明确指示:0
。
另一种方法:notify-send
似乎聚集DISPLAY
并XAUTHORITY
带有一些dbus
魔法。但我不知道如何。如果至少有一个 dbus 守护进程正在运行,那可能是最干净和最便携的方式。
最终解决方案不需要 root,并且可以通过自动方式从非交互式 shell 访问,并且比之前提供的可能的重复链接更先进和可用:
- XAUTHORITY
:
ps -u $(id -u) -o pid= |
xargs -I{} cat /proc/{}/environ 2>/dev/null |
tr '\0' '\n' |
grep -m1 '^XAUTHORITY='
Run Code Online (Sandbox Code Playgroud)
- DISPLAY
:
ps -u $(id -u) -o pid= |
xargs -I{} cat /proc/{}/environ 2>/dev/null |
tr '\0' '\n' |
grep -m1 '^DISPLAY='
Run Code Online (Sandbox Code Playgroud)
该片段列出了所有用户的pids
,迭代它们,然后在第一个匹配处中断
基于此
归档时间: |
|
查看次数: |
6705 次 |
最近记录: |