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.

割り当てられたディスプレイ番号を確認するにはどうすればよいですか?

または、現在開いているディスプレイとそのユーザーをリストしますか?

回答:


29

ユーザーのセッションで実行されている1つのプロセス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

1つのXセッションにのみログインしている場合、上記のように1行のみが出力されます:0


注:これを1行で使用する場合は、の;前にを追加する必要があります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を使用しています。ただし、この解決策は、カーネルが新しいプロセスIDを昇順で割り当てているという事実だけに依存しているため、常にそうであるとは限りません。


おかげで、DISPLAYのコンサルティングは私が思う答えです。ただし、DISPLAY変数は古い可能性があります。これは、スクリーンセッションに再接続するときに発生しました。グラフィカルなものが機能しなくなりました。DISPLAYをデタッチし、エコーし、再アタッチし、DISPLAYを新しい値に設定することで解決しました。
ricab

Linuxは、各プロセスの下での環境を公開/proc/$pid/environのように、cat /proc/$$/environ | tr '\0' '\n' | grep '^DISPLAY='。別の使用例については、私の回答をご覧ください。
アミール

2

この回答には、who&grep に基づく1行のライナーがあります

/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/Home

termsql そのような情報を抽出するための優れたツールです。

DISPLAY番号を見つけることは、例の1つです。

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

(Xバイナリが呼び出されると仮定して、DISPLAY環境変数を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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.