如何获取 X 分配给我的显示号码

如何获取 X 分配给我的显示号码

来自 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.

我如何才能找到已分配给我的显示号码?

或者列出当前打开的显示及其用户?

答案1

who这个答案有一个基于& grep 的单行

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

答案2

如果您知道用户会话中正在运行的一个进程 ID,并且您有权访问该进程的信息,则您可以在其环境中查找变量DISPLAY

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

例如,要列出您的 UID 在当前计算机上使用的所有主显示器,请使用:

ps -u $(id -u) -o pid= \
    | xargs -I PID -r cat /proc/PID/environ 2> /dev/null \
    | tr '\0' '\n' \
    | grep ^DISPLAY=: \
    | sort -u

如果你只登录到一个 X 会话,上述内容应该只输出一行,类似如下的内容DISPLAY=:0

答案3

在 X 会话中,您始终可以查阅DISPLAY环境变量来获取当前显示号码 ( echo $DISPLAY)。

发现其他的'显示数字更难。我认为除了询问所有用户他们连接到哪个显示器之外,没有任何标准方法可以获取这些信息,因此任何获取此信息的尝试都需要某种黑客手段,并且并非在所有情况下都有效。

给出了一些选项东南其他地方但它们在 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 会话启动时,窗口管理器通常会以会话所属的用户身份启动,然后您便会获得用户名。在我的例子中,用户 1 使用 KDE,而用户 2 使用 LXDE。然而,该解决方案完全依赖于内核恰好按升序分配新进程 ID 的事实,但情况可能并非总是如此。

答案4

与阿米尔的回答有一点不同。

ps e将输出每个命令的环境,以空格分隔,以便可以直接传递给sed过滤掉 DISPLAY,从而提供比直接读取 /proc/PID/environ 更简单的命令。(但是,要读取其他用户的环境,您仍然需要 root 权限。)

此代码将输出所有具有 X 会话的登录用户的姓名及其显示号码:

#!/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

相关内容