저는 Arch Linux를 사용하고 있으며 (env 변수를 통하지 않고) 현재 Xorg DISPLAY를 검색하려고 할 때 상황이 그리 쉽지 않습니다.
다음은 실제 예입니다.
$ cat /sys/class/tty/tty0/active
tty2
who | awk -v term="tty2" '/\(:/ $0 ~ term { gsub(/\(|\)/, "", $0); print $5 }'
:0
이는 어떤 경우에는 작동하지만 다른 경우에는 작동하지 않습니다.
$ cat /sys/class/tty/tty0/active
tty3
who | awk -v term="`cat /sys/class/tty/tty0/active`" '/\(:/ $0 ~ term { gsub(/\(|\)/, "", $0); print $5 }'
NOTHING
이유:
$ who
uzumaki tty2 2015-05-16 10:50 (:0)
guest pts/2 2015-05-16 11:47 (:1)
uzumaki tty4 2015-05-16 11:07
게스트 사용자(tty3)는 pts(의사 터미널)를 사용하여 세션을 시작합니다.
저는 특정 명령 없이 xorg 서버를 시작하는 gdm을 사용하고 있습니다(표시 번호는 명확하지 않음).
$ ps au | grep -e Xorg -e vt
uzumaki 788 1.4 0.9 740464 150672 tty2 Sl+ 10:50 5:38 /usr/lib/xorg-server/Xorg vt2 -displayfd 3 -auth /run/user/1000/gdm/Xauthority -nolisten tcp -background none -noreset -keeptty -verbose 3
guest 1062 0.0 0.1 465748 32344 tty3 Sl+ 10:51 0:19 /usr/lib/xorg-server/Xorg vt3 -displayfd 3 -auth /run/user/1002/gdm/Xauthority -nolisten tcp -background none -noreset -keeptty -verbose 3
따라서 질문은 다음과 같습니다. 현재(사용 중인) XServer DISPLAY 수를 찾는 방법은 무엇입니까?현재 위에서 언급한 것처럼 여러 서버(여러 사용자)를 가질 수 있기 때문입니다.
답변1
loginctl list-sessions
세션 목록 가져오기를 사용한 다음 loginctl show-session -p Display -p Active <session ID>
각 세션을 사용하여 현재 활성 세션과 연결된 X11 디스플레이 번호를 가져올 수 있습니다.
다음과 같은 것(bash에서):
TARGET_DISPLAY=()
while read id uid user seat; do
while IFS='=' read property value; do
case "$property" in
Active)
if [[ "$value" != "yes" ]]; then continue; fi
;;
Display)
if [[ "$value" ]]; then
TARGET_DISPLAY+=( "$value" )
fi
# else the session isn't graphical
;;
esac
done < <(loginctl show-session -p Display -p Active "$id")
done < <(loginctl list-sessions --no-legend)
$TARGET_DISPLAY
다중 시트 시스템에서 여러 활성 세션이 있을 수 있다고 가정하기 때문에 여기 에 배열이 있습니다. 구성에서 이것이 가능하지 않은 경우 이를 간단한 변수로 만들고 break 2
할당 후에 명령문을 추가하여 두 루프를 모두 종료할 수 있습니다.
하지만...
...이 경우 X 서버가 시작되기 때문에 더 이상 GDM에서 작동하지 않습니다.~에세션(사용자 권한 포함)이며 /usr/bin/gdm-x-session
이 정보를 다시 전달하지 않습니다 logind
(해당 API가 없기 때문에).
이는 다른 경우에도 작동할 가능성이 높습니다(세션을 생성하기 전에 DM에 의해 X 서버가 시작된 경우). 다른 방법은 모르겠습니다. 죄송합니다.
답변2
글쎄, 지금 내 말은긍정적인XOrg 서버 표시. 여러 개의 XOrg 서버를 실행할 수 있으며 다중 헤드일 수 있으므로 조작하기가 더 어려워진다는 점을 명심하세요.
또 다른 중요한 참고 사항은 일부 경우(예: systemd) DISPLAY 변수에 액세스할 수 없다는 것입니다.
약간의 논의 끝에명령줄 푸, 나는 다음과 같은 결과를 얻습니다.
for p in $(pgrep -t $(cat /sys/class/tty/tty0/active));
do
d=$(awk -v RS='\0' -F= '$1=="DISPLAY" {print $2}' /proc/$p/environ 2>/dev/null);
[[ -n $d ]] && break;
done;
echo $d
이 코드 조각은 제어 터미널이 설정되어 있고 해당 프로세스의 터미널과 일치하는 모든 프로세스(실제로는 해당 ID) 목록을 반복합니다. 각 프로세스의 환경에서 DISPLAY
변수를 확인하고, 변수를 찾으면 바로 만족합니다. 변수가 발견 되면 DISPLAY
목록 반복을 중지하고 echo
결과를 가져옵니다.
그러면 스크립트를 실행하는 활동이 표시됩니다.
답변3
다음은 동일한 호스트에서 두 개의 서버를 실행하는 예입니다. 아래 출력에서 볼 수 있듯이 startx
시작했습니다 . pstree -pl
set이 있는 첫 번째 하위 프로세스 $DISPLAY
는 다음과 같습니다 .xinitrc
.
|-login(698)---zsh(1077)---startx(1359)---xinit(1381)-+-.xinitrc(1386)...
다음은 명령입니다. 설정이 다른 경우 .xinitrc
여기에서 다른 것으로 변경할 수 있습니다.
$ pgrep .xinitrc | while read i; do \
d=$(cat /proc/$i/environ | tr '\0' '\n' | grep DISPLAY); \
echo -n $d" "; eval $d xprintidle; \
done | sort -n -k 2
DISPLAY=:1 93
DISPLAY=:0 603301
이 숫자는 각 모니터의 유휴 시간을 밀리초 단위로 표시합니다. 맨 위 행에는 가장 최근에 활성화된(가장 유휴 상태인) 디스플레이가 표시됩니다.
그만한 가치가 있기 때문에 다른 답변 중 어느 것도 나에게 적합하지 않습니다.
답변4
다른 답변을 기반으로 한 솔루션은 다음과 같습니다.
#!/bin/bash
DISPLAY=""
# Guess the active DISPLAY
while read session; do
# Explode to needed variables
set -- $session; tty=$2; display=$3
# If there is an X session in thet TTY
if [ "$display" != "-" ]; then
# 1st non root display is used if TTY is not matched with the active
[ "$DISPLAY" == "" ] && DISPLAY="$display"
# If it is the active TTY we can stop, this is the active X!
[ "$tty" == "$(cat /sys/class/tty/tty0/active)" ] && DISPLAY="$display";
fi
done <<< "$(w -hs)"
echo "$DISPLAY"
X 세션이 있는 모든 로그인 세션을 확인합니다. tty도 일치하면 활성 X 세션이라고 확신하고, 그렇지 않으면 첫 번째 세션을 사용합니다.
원하는 경우 현재 사용자와 일치하도록 이 스크립트를 확장할 수도 있습니다.