X에 의해 할당 된 표시 번호를 얻는 방법


20

X (7) 매뉴얼 페이지에서

DISPLAY NAMES
       From the user's perspective, every X server has a display name of the form:

                                  hostname:displaynumber.screennumber
[...]

displaynumber
    [...]
    To avoid confusion, each display on a machine is assigned a display
    number (beginning at 0) when the X server for that display is started.

할당 된 표시 번호를 어떻게 찾을 수 있습니까?

아니면 현재 열려있는 디스플레이와 사용자를 나열 하시겠습니까?

답변:


29

사용자 세션에서 실행중인 하나의 프로세스 ID를 알고 있고 해당 프로세스 정보에 액세스 할 수있는 권한이 있으면 해당 환경에 DISPLAY변수 를 추가 할 수 있습니다 .

cat /proc/$pid/environ | tr '\0' '\n' | grep '^DISPLAY='

예를 들어, 현재 컴퓨터에서 UID가 사용하는 모든 기본 디스플레이를 나열하려면 다음을 사용하십시오.

ps -u $(id -u) -o pid= | \
    while read pid; do
        cat /proc/$pid/environ 2>/dev/null | tr '\0' '\n' | grep '^DISPLAY=:'
    done | grep -o ':[0-9]*' | sort -u

하나의 X 세션에만 로그인 한 경우 위와 같이 한 줄만 출력해야합니다 :0.


참고 : 한 줄에 이것을 사용하려면 앞에을 추가 ;해야합니다 done.
not2qubit

@ user1147688 감사하지만 개행 문자는 적어도 내가 사용하는 쉘 (Bash and Dash)에서도 작동합니다.
Amir

무성한! 감사. 나는 약간의 향상과 함께 unix.stackexchange.com/a/429162/12574 를 위해 이것을 훔쳤다 ;)
Gilles Quenot

11

X 세션에서는 항상 DISPLAY환경 변수를 참조하여 현재 표시 번호 ( echo $DISPLAY) 를 얻을 수 있습니다 .

다른 사람의 표시 번호를 찾는 것이 더 어렵습니다. 나는 연결된 모든 사용자에게 묻는 것 이외의 정보를 얻는 표준 방법이 없다고 생각 하므로이 정보를 얻으려면 해커가 필요하며 모든 경우에 작동하지는 않습니다.

SE 에는 다른 옵션이 있지만 Debian Wheezy에서는 작동하지 않습니다. 그러나 위에 링크 된 게시물에 표시된 것처럼 현재 활성화 된 디스플레이를 나열하는 것은 쉽습니다.

ps axu | grep "X " 다음과 같이 현재 실행중인 X 프로세스를 표시합니다.

root      2354  0.0  0.5  23380 18292 tty8     Ss+  Sep15   2:36 /usr/bin/X :1 vt8 -br -nolisten tcp -auth /var/run/xauth/A:1-7xlyuc
root      7901  0.0  0.3  17044 12072 tty7     Ss+  Sep14   5:58 /usr/bin/X :0 vt7 -br -nolisten tcp -auth /var/run/xauth/A:0-wckh0a

다음의 첫 번째 매개 변수 /usr/bin/X는 콜론이 앞에 붙은 표시 번호이고 다음 매개 변수 는 세션에 지정된 가상 터미널을 보여줍니다.

그러나 프로세스 목록을 보면 다음과 같은 답변을 얻을 수 있습니다.

ps axu |grep -3 "X "

root      1990  0.0  0.0      0     0 ?        S    Sep14   0:00 [kjournald]
root      1991  0.0  0.0      0     0 ?        S    Sep14   0:00 [kjournald]
root      1992  0.0  0.0      0     0 ?        S    Sep14   0:00 [kjournald]
root      2354  0.0  0.5  23380 18292 tty8     Ss+  Sep15   2:36 /usr/bin/X :1 vt8 -br -nolisten tcp -auth /var/run/xauth/A:1-7xlyuc
root      2359  0.0  0.0   5264  2228 ?        S    Sep15   0:00 -:1            
user_1     2378  0.0  0.0   4920  1348 ?        Ss   Sep15   0:00 /bin/sh /usr/bin/startkde
user_1     2443  0.0  0.0   3868   348 ?        Ss   Sep15   0:00 /usr/bin/ssh-agent env TMPDIR=/var/tmp /usr/bin/dbus-launch --exit-with-session /usr/bin/openbox-kde-session
--
root      7500  0.0  0.0   6460  1080 ?        Ss   Sep14   0:00 /usr/sbin/sshd
ntp       7841  0.0  0.0   5352  1760 ?        Ss   Sep14   0:17 /usr/sbin/ntpd -p /var/run/ntpd.pid -g -u 108:111
root      7882  0.0  0.0   3964   716 ?        Ss   Sep14   0:00 /usr/bin/kdm -config /var/run/kdm/kdmrc
root      7901  0.0  0.3  17044 12072 tty7     Ss+  Sep14   5:59 /usr/bin/X :0 vt7 -br -nolisten tcp -auth /var/run/xauth/A:0-wckh0a
root      7906  0.0  0.0   5260  2224 ?        S    Sep14   0:00 -:0            
user_2    7925  0.0  0.0  12924  1560 ?        Ssl  Sep14   0:00 /usr/bin/lxsession -s LXDE -e LXDE
user_2    7990  0.0  0.0   3868   348 ?        Ss   Sep14   0:00 /usr/bin/ssh-agent env TMPDIR=/var/tmp /usr/bin/dbus-launch --exit-with-session /usr/bin/startlxde

라인에서 봐 후 /usr/bin/X-는 X 세션이 시작, 창 관리자는 일반적으로 세션에 속한 사용자로 시작, 당신은 사용자 이름을 거기로. 필자의 경우 user_1은 KDE를 사용하고 user_2는 LXDE를 사용하고 있습니다. 그러나이 솔루션은 커널이 새로운 프로세스 ID를 오름차순으로 할당한다는 사실에 전적으로 의존하며, 항상 그런 것은 아닙니다.


감사합니다. DISPLAY 컨설팅은 제가 생각하는 답변입니다. 그러나 DISPLAY 변수가 오래되었을 수 있습니다. 스크린 세션에 다시 연결할 때 이런 일이 일어났습니다 . 그래픽이 작동하지 않습니다. DISPLAY를 분리, 반향, 재 연결 및 DISPLAY를 새 값으로 설정하여 해결했습니다.
ricab

리눅스는 /proc/$pid/environ에서처럼 각 프로세스의 환경을 노출시킨다 cat /proc/$$/environ | tr '\0' '\n' | grep '^DISPLAY='. 다른 사용법 예제는 내 대답을 참조하십시오.
Amir

2

이 답변에는 who& grep를 기반으로 한 라이너가 있습니다.

/ubuntu//a/230838/152287

who 로 약칭 될 수있다 w

하나의 라이너를 포함한 링크에서 더 많은 것을 읽을 수 있습니다.

효과가있다. 다음은 raspberrypi (rasbian) 출력입니다. 여기서 표시 값은 FROM 열에 있습니다.

tim@raspberrypi:~ $ w
 19:19:30 up  8:15,  2 users,  load average: 0.12, 0.11, 0.09
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
pi       tty7     :0               11:04    8:15m  1:15   0.89s /usr/bin/lxsess
tim      pts/0    192.168.0.29     19:17    0.00s  1.00s  0.09s w

1

https://gitorious.org/termsql/pages/Home

termsql 그런 정보를 추출하는 좋은 도구입니다.

DISPLAY 번호를 찾는 것이 예제 중 하나입니다.

export DISPLAY=$(ps aux | termsql "select COL11 from tbl where COL10 like '%Xorg.bin%' limit 1")

(X 바이너리가라고 가정하고 DISPLAY 환경 변수를 디스플레이 X가 현재 실행중인 것으로 설정하십시오 Xorg.bin)


1

Amir의 답변에 약간의 변형이 있습니다.

ps esed/ proc / PID / environ을 직접 읽는 것보다 간단한 명령을 제공하여 DISPLAY를 필터링 하기 위해 직접 전달할 수 있도록 각 명령의 환경을 공백으로 구분하여 출력합니다 . (다른 사용자의 환경을 읽으려면 여전히 루트 권한이 필요합니다.)

이 코드는 X 세션을 가진 모든 로그인 한 사용자의 이름과 DISPLAY 번호를 출력합니다.

#!/bin/bash
declare -A disps usrs
usrs=()
disps=()

for i in $(users);do
    [[ $i = root ]] && continue # skip root
    usrs[$i]=1
done # unique names

for u in "${!usrs[@]}"; do
    for i in $(sudo ps e -u "$u" | sed -rn 's/.* DISPLAY=(:[0-9]*).*/\1/p');do
        disps[$i]=$u
    done
done

for d in "${!disps[@]}";do
    echo "User: ${disps[$d]}, Display: $d"
done
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.