如何获得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.

如何找到已分配的显示编号?

还是列出当前打开的显示器及其用户?

Answers:


29

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

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谢谢,但是换行符也同样有效,至少在我使用的shell中(Bash和Dash)。
阿米尔(Amir)2013年

太棒了!谢谢。我偷了这对unix.stackexchange.com/a/429162/12574);有一些增强
吉尔斯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 2013年

Linux公开了Linux下的每个进程的环境/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/首页

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 / environ给出了更简单的命令。(不过,要读取其他用户的环境,您仍然需要root权限。)

此代码将输出所有具有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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.