16

Из 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.

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

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

5 ответов5

21

Если вам известен один идентификатор процесса, запущенный в сеансе пользователя, и у вас есть разрешение на доступ к информации этого процесса, вы можете использовать его среду для переменной 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 .

9

В сеансе 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. Однако это решение основано исключительно на том факте, что ядро назначает новые идентификаторы процессов в возрастающей последовательности, что может быть не всегда.

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
0

Этот ответ говорит, чтобы использовать who & grep это

https://askubuntu.com/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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .