我有一个项目需要检测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 系统?)上是否可靠
有没有更可靠/便携的方式?
在具有 init 系统
systemd
的发行版上,输出显示
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
陷阱:
Xwayland
.Xvfb
其他东西。通常
Xorg
命令还包含显示编号。不幸的是,我的没有:-displayfd 3
不知何故指向DISPLAY
. 如果以 root 身份查看/proc/$(pidof Xorg)/fd/3
我发现虽然,我不知道如何寻找 socket
21437
。我确信它指向/tmp/.X11-unix/X0
. 一种方法是lsof +E -aUc Xorg
显示有趣的输出:包含许多连接@/tmp/.X11-unix/X0
和一个dbus
连接。有点脏:
fd
文件夹也显示给我Xorg.0.log
是一个明确的显示指示:0
。另一种方法:
notify-send
似乎聚集DISPLAY
并XAUTHORITY
带有一些dbus
魔力。但我不知道如何。如果至少有一个 dbus 守护进程正在运行,那么这可能是最干净和最便携的方式。最终解决方案不需要 root 用户,并且可以从非交互式 shell 以自动化方式访问,并且比之前提供的可能的重复链接更先进和可用:
-
XAUTHORITY
:-
DISPLAY
:该片段列出了所有用户的
pids
,遍历它们,然后在第一个匹配时中断基于此