我有一个项目需要检测DISPLAY
外壳内(巴什)变量能够显示一些桂本地机器上的东西。
或者更好的解决方案(总线?) 打开桂非交互式 shell 中的东西,无需尝试找出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(Unixes?)上是否可靠
有更可靠/便携的方式吗?
答案1
在具有 init 系统的发行版上,systemd
输出为
systemctl --user show-environment
显示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
。
陷阱:
- 可以有多个 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 守护进程正在运行,这可能是最干净、最便携的方式。
答案2
最终解决方案不需要 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
,迭代它们,然后在第一个匹配处中断
基于这