X(7) manページから
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つのプロセス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セッションにのみログインしている場合、上記では:0
のような行が1行だけ出力されます。
Xセッションでは、いつでもDISPLAY
環境変数を調べて、現在のディスプレイ番号(echo $DISPLAY
)を取得できます。
othersの表示番号を見つけるのは難しいです。接続しているディスプレイをすべてのユーザーに尋ねる以外に情報を取得する標準的な方法はないと思います。そのため、この情報を取得するには、何らかのハッカーが必要であり、すべてのケースで機能するわけではありません。
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を昇順で割り当てているという事実に完全に依存しています。常にそうであるとは限りません。
この回答には、who
とgrepに基づくワンライナーがあります
https://askubuntu.com/a/230838/152287
who
はw
と省略できます
値を取得するためのワンライナーを含むリンクで詳細を読むことができます。
できます。以下は、表示値がFROM列にある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
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環境のバイナリがXorg.bin
)
アミールの回答の小さなバリエーション。
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