Как получить номер дисплея мне был назначен 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.

Как я могу найти номер дисплея, который мне назначен?

Или список открытых в данный момент дисплеев и их пользователей?

ricab
источник

Ответы:

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 и Dash).
Амир
Бриллиант! Благодарю. Я украл это для unix.stackexchange.com/a/429162/12574 с некоторыми улучшениями;)
Жиль Квено
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. Однако это решение основано исключительно на том факте, что ядро ​​назначает новые идентификаторы процесса в возрастающей последовательности, что может быть не всегда.

zagrimsan
источник
Спасибо, консалтинг DISPLAY - это ответ, я думаю. Однако переменная DISPLAY может быть устаревшей. Это случилось со мной при подключении к экранной сессии. Это заставило графические вещи не работать. Я решил это путем отсоединения, отображения DISPLAY, повторного подключения и установки DISPLAY на новое значение.
Рикаб
Linux предоставляет среду каждого процесса /proc/$pid/environ, как в cat /proc/$$/environ | tr '\0' '\n' | grep '^DISPLAY='. Смотрите мой ответ для другого примера использования.
Амир
2

Этот ответ содержит однострочник, основанный на who& grep

/ubuntu//a/230838/152287

who может быть сокращено как w

Вы можете прочитать больше по ссылке, включая одну строку, чтобы получить значение.

Оно работает. Вот вывод raspberrypi (rasbian), где отображаемое значение находится в столбце ОТ

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")

(установите для переменной окружения DISPLAY значение, на котором сейчас работает дисплей X, при условии, что вызывается двоичный файл X Xorg.bin)

Ано
источник
1

Небольшая вариация ответа Амира.

ps eбудет выводить среду каждой команды, разделенную пробелами, так что ее можно будет передать напрямую для sedфильтрации DISPLAY, предоставляя более простую команду, чем непосредственное чтение / proc / PID / environment. (Тем не менее, для чтения окружений других пользователей вам все еще нужны права суперпользователя.)

Этот код выведет имена всех вошедших в систему пользователей с 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
johnraff
источник