DISPLAY
쉘 내부를 감지해야 하는 프로젝트가 있습니다 (세게 때리다) 변수는 일부를 표시할 수 있습니다.구이로컬 컴퓨터에 뭔가가 있습니다.
또는 더 나은 솔루션(버스? ) 열려 있는구이DISPLAY
합계를 알아내려고 시도하지 않고 비대화형 쉘에 있는 것입니다 XAUTHORITY
.
설정할 수 있지만 DISPLAY=:0
사용자가 다른 세션을 사용하면 실패합니다.
대화형 모드가 아닌 한 내가 시도한 것(잘 작동하지만 루트에서만 작동)은 다음과 같습니다.
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
. 최소한 gdm3
systemd 및 디스플레이 관리자가 있는 데비안 9 시스템의 경우입니다.
함정: startx xterm -- :2 vt2
tty2에서 실행한 후 systemctl이 표시 DISPLAY
되고 XAUTHORITY
다시 표시됩니다. 내 기본 모니터는 :0
더 이상 이와 같지 않습니다.
다른 방법:
최소한 XAUTHORITY
출력을 구문 분석 ps aux | grep Xorg
하고 옵션을 찾는 것이 더 안정적입니다 -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
로 보는 경우 ./proc/$(pidof Xorg)/fd/3
lrwx------ 1 root root 64 Mär 8 22:45 3 -> socket:[21437]
그러나 소켓을 찾는 방법을 모르겠습니다 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
것 같습니다 . 하지만 어떻게 해야할지 모르겠습니다. 적어도 하나의 dbus 데몬이 실행 중인 경우 이는 아마도 가장 깨끗하고 이식성이 뛰어난 방법일 것입니다.DISPLAY
XAUTHORITY
dbus
답변2
최종 솔루션은 루트가 필요하지 않으며 자동화된 방식으로 비대화형 셸에서 액세스할 수 있으며 솔루션보다 훨씬 빠릅니다.중복 가능성이전에 제공된 링크:
- 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
하고 이를 반복한 다음 첫 번째 일치에서 중단됩니다.
기반으로이것