Eu tenho um projeto que precisa detectar a variável DISPLAY
in shell ( bash ) para poder exibir algumas coisas da GUI na máquina local.
Ou uma solução melhor ( dbus ?) Para abrir coisas de gui em shell não interativo sem tentar descobrir DISPLAY
e XAUTHORITY
.
Posso definir, DISPLAY=:0
mas isso falhará se um usuário usar outra sessão.
Como não estou no modo interativo, o que tentei (funciona bem, mas apenas como root) é:
strings /proc/$(pidof Xorg)/environ | grep -Eo 'DISPLAY=:[0-9]+(:[0-9])*'
ou como usuário:
ps uww $(pidof Xorg) | grep -oE '[[:blank:]]:[0-9]+(:[0-9])*\b'
Mas não sei se é confiável em algum Linux (Unixes?)
Existe uma maneira mais confiável/portátil?
Em distribuições com sistema init,
systemd
a saída deshows
DISPLAY
eXAUTHORITY
. Isso é verdade pelo menos para o meu sistema debian 9 com systemd egdm3
como gerenciador de exibição.Armadilha: Depois de rodar
startx xterm -- :2 vt2
no tty2 systemctl me deuDISPLAY
eXAUTHORITY
da nova tela; minha tela principal:0
não era mais observável dessa maneira.Outras abordagens:
Pelo menos
XAUTHORITY
é mais confiável analisar a saídaps aux | grep Xorg
e procurar a opção-auth
. No meu caso, está localizado em/run/user/1000/gdm/Xauthority
e não em~/.Xauthority
.Armadilhas:
Xwayland
.Xvfb
ou outra coisa.Normalmente
Xorg
, os comandos também contêm o número de exibição. Infelizmente, o meu não:-displayfd 3
de alguma forma aponta paraDISPLAY
. Se olhando como root/proc/$(pidof Xorg)/fd/3
eu achoPorém, não sei como procurar socket
21437
. Tenho certeza de que aponta para/tmp/.X11-unix/X0
. Uma abordagem élsof +E -aUc Xorg
que mostra uma saída interessante: muitas conexões contendo@/tmp/.X11-unix/X0
e umadbus
conexão.Um pouco sujo: A
fd
pasta também me mostraXorg.0.log
é uma indicação clara para exibição:0
.Outra abordagem:
notify-send
parece reunirDISPLAY
eXAUTHORITY
com algumadbus
magia. Mas não tenho ideia de como. Essa pode ser a maneira mais limpa e portátil, se pelo menos um daemon dbus estiver em execução.Solução final que não requer root e acessível a partir de um shell não interativo de maneira automatizada e mais avançada e utilizável do que o possível link duplicado fornecido anteriormente:
-
XAUTHORITY
:-
DISPLAY
:O snippet lista todos os usuários
pids
, itera sobre eles e, em seguida, quebra na primeira correspondênciaCom base nisso