하지만...

하지만...

저는 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 -plset이 있는 첫 번째 하위 프로세스 $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 세션이라고 확신하고, 그렇지 않으면 첫 번째 세션을 사용합니다.

원하는 경우 현재 사용자와 일치하도록 이 스크립트를 확장할 수도 있습니다.

관련 정보