Jak uzyskać numer wyświetlacza Zostałem przydzielony przez X

20

Ze stron podręcznika 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.

Jak znaleźć numer, który został mi przypisany?

Lub lista aktualnie otwartych wyświetlaczy i ich użytkowników?

ricab
źródło

Odpowiedzi:

29

Jeśli znasz jeden identyfikator procesu działający w sesji użytkownika i masz uprawnienia dostępu do informacji o tym procesie, możesz grep jego środowisko dla DISPLAYzmiennej:

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

Na przykład, aby wyświetlić listę wszystkich głównych wyświetlaczy używanych przez UID na bieżącym komputerze, użyj:

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

Jeśli jesteś zalogowany tylko do jednej sesji X, powyższe powinno wypisać tylko jedną linię z czymś podobnym :0.

Amir
źródło
Uwaga: jeśli chcesz użyć tego w jednej linii, musisz dodać znak ;przed done.
not2qubit
@ user1147688 dzięki, ale znak nowej linii działa równie dobrze, przynajmniej w używanych przeze mnie powłokach (Bash i Dash).
Amir
Brillant! Dzięki. Ukradłem to dla unix.stackexchange.com/a/429162/12574 z pewnymi ulepszeniami;)
Gilles Quenot
11

W sesji X zawsze możesz sprawdzić DISPLAYzmienną środowiskową, aby uzyskać bieżącą liczbę wyświetlania ( echo $DISPLAY).

Znalezienie numerów wyświetlanych przez innych jest trudniejsze. Nie sądzę, że istnieje jakikolwiek standardowy sposób uzyskiwania informacji poza pytaniem wszystkich użytkowników, z którymi ekranami są połączeni, więc każda próba uzyskania tych informacji wymaga pewnego rodzaju hakowania i nie będzie działać we wszystkich przypadkach.

Niektóre opcje podano gdzie indziej w SE, ale na przykład nie będą działać w Debian Wheezy. Jednak wyświetlenie aktualnie aktywnych wyświetlaczy jest łatwe, jak pokazano w poście, który zamieściłem powyżej:

ps axu | grep "X " pokaże aktualnie uruchomione procesy X, coś w stylu:

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

Pierwszy parametr po /usr/bin/Xto numer wyświetlania poprzedzony dwukropkiem, a następny pokazuje wirtualny terminal przypisany do sesji.

Możesz jednak uzyskać odpowiedź po przejrzeniu listy procesów:

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

Spójrz na następujące wiersze po /usr/bin/X- gdy rozpoczyna się sesja X, menedżer okien jest zwykle uruchamiany jako użytkownik, do którego należy sesja, i tam dostajesz nazwę użytkownika. W moim przypadku użytkownik_1 używa KDE, a użytkownik_2 używa LXDE. Jednak to rozwiązanie opiera się wyłącznie na fakcie, że jądro przypisuje nowe identyfikatory procesów w kolejności rosnącej, co może nie zawsze mieć miejsce.

zagrimsan
źródło
Dzięki, konsultacje z DISPLAY to odpowiedź, którą myślę. Jednak zmienna DISPLAY może być nieaktualna. Zdarzyło mi się to po ponownym podłączeniu do sesji ekranowej . Powodowało to, że elementy graficzne nie działały. Rozwiązałem go, odłączając, wyświetlając echo WYŚWIETLACZA, ponownie podłączając i ustawiając WYŚWIETLACZ na nową wartość.
ricab,
Linux odsłania środowisko każdego procesu pod /proc/$pid/environ, jak w cat /proc/$$/environ | tr '\0' '\n' | grep '^DISPLAY='. Zobacz moją odpowiedź na inny przykład użycia.
Amir
2

Ta odpowiedź ma jedno-liniowe, oparte na who& grep

/ubuntu//a/230838/152287

who można skrócić jako w

możesz przeczytać więcej pod linkiem, w tym linijką, aby uzyskać wartość.

To działa. Oto wyjście raspberrypi (rasbian), gdzie wartość wyświetlana jest w kolumnie 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
Tim Richardson
źródło
1

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

termsql jest dobrym narzędziem do wydobywania takich informacji.

Znalezienie numeru WYŚWIETLACZA jest jednym z przykładów:

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

(ustaw zmienną środowiskową DISPLAY na to, na którym obecnie działa X, zakładając, że wywoływany jest plik binarny X Xorg.bin)

Nie
źródło
1

Mała odmiana odpowiedzi Amira.

ps ewyświetli środowisko każdego polecenia, oddzielone spacją, aby można je było przekazać bezpośrednio w sedcelu odfiltrowania WYŚWIETLACZA, dając prostsze polecenie niż bezpośrednie czytanie / proc / PID / Environment. (Aby jednak odczytać środowiska innych użytkowników, nadal potrzebujesz uprawnień roota.)

Ten kod wyświetli nazwy wszystkich zalogowanych użytkowników z sesjami X i ich numery WYŚWIETLACZA:

#!/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
johnraff
źródło