私はArch Linuxを使用しています。現在のXorg DISPLAYを(env変数を介さずに)見つけようとすると、それほど簡単ではありません。
これが実際の例です:
$ cat /sys/class/tty/tty0/active
tty2
who | awk -v term="tty2" '/\(:/ $0 ~ term { gsub(/\(|\)/, "", $0); print $5 }'
:0
それが機能する場合とそうでない場合があります。
$ cat /sys/class/tty/tty0/active
tty3
who | awk -v term="`cat /sys/class/tty/tty0/active`" '/\(:/ $0 ~ term { gsub(/\(|\)/, "", $0); print $5 }'
NOTHING
原因:
$ who
uzumaki tty2 2015-05-16 10:50 (:0)
guest pts/2 2015-05-16 11:47 (:1)
uzumaki tty4 2015-05-16 11:07
ゲストユーザー(tty3)は、pts(疑似端末)を使用してセッションを開始しました。
私はgdmを使用しており、特定のコマンドなしでxorgサーバーを起動します(表示番号は明確ではありません)。
$ ps au | grep -e Xorg -e vt
uzumaki 788 1.4 0.9 740464 150672 tty2 Sl+ 10:50 5:38 /usr/lib/xorg-server/Xorg vt2 -displayfd 3 -auth /run/user/1000/gdm/Xauthority -nolisten tcp -background none -noreset -keeptty -verbose 3
guest 1062 0.0 0.1 465748 32344 tty3 Sl+ 10:51 0:19 /usr/lib/xorg-server/Xorg vt3 -displayfd 3 -auth /run/user/1002/gdm/Xauthority -nolisten tcp -background none -noreset -keeptty -verbose 3
100万の質問は次のとおりです。現在の(使用中の)XServer DISPLAY番号を確認する方法は?現在のように、複数のサーバー(複数のユーザー)を持つことができます。
まあ、私が現在activeXOrgサーバーの表示を意味するように。複数のXOrgサーバーを実行でき、それらがマルチヘッドになる可能性があることを忘れないでください。これにより、操作が難しくなります。
その他の重要な注意点は、DISPLAY変数にアクセスできない場合があることです(systemdなど)。
commandlinef で議論した後、私はこの結果を得ました:
for p in $(pgrep -t $(cat /sys/class/tty/tty0/active));
do
d=$(awk -v RS='\0' -F= '$1=="DISPLAY" {print $2}' /proc/$p/environ 2>/dev/null);
[[ -n $d ]] && break;
done;
echo $d
このスニペットは、制御端末が設定されているすべてのプロセス(実際にはそれらのID)のリストを反復処理し、このプロセスの端末と一致します。各プロセスの環境でDISPLAY
変数をチェックし、環境変数が見つかるとすぐに満たされます。 DISPLAY
変数を見つけると、リストの反復を停止し、結果をecho
sします。
これにより、スクリプトを実行するアクティブなディスプレイが印刷されます。
これは他の答えに基づいた私の解決策です:
#!/bin/bash
DISPLAY=""
# Guess the active DISPLAY
while read session; do
# Explode to needed variables
set -- $session; tty=$2; display=$3
# If there is an X session in thet TTY
if [ "$display" != "-" ]; then
# 1st non root display is used if TTY is not matched with the active
[ "$DISPLAY" == "" ] && DISPLAY="$display"
# If it is the active TTY we can stop, this is the active X!
[ "$tty" == "$(cat /sys/class/tty/tty0/active)" ] && DISPLAY="$display";
fi
done <<< "$(w -hs)"
echo "$DISPLAY"
これにより、Xセッションがあるすべてのログインセッションがチェックされます。 ttyも一致する場合は、それがアクティブなXセッションであることを確認できます。それ以外の場合は、最初のセッションを使用します。
このスクリプトは、必要に応じて、現在のユーザーにも一致するように拡張できます。
2つのサーバーが同じホストで実行されている例を次に示します。以下のpstree -pl
の出力からわかるように、startx
を使用して両方を起動しました。 $DISPLAY
が設定された最初の子プロセスは.xinitrc
です。
|-login(698)---zsh(1077)---startx(1359)---xinit(1381)-+-.xinitrc(1386)...
これはコマンドです。別の設定をしている場合は、ここで.xinitrc
を別のものに変更できます。
$ pgrep .xinitrc | while read i; do \
d=$(cat /proc/$i/environ | tr '\0' '\n' | grep DISPLAY); \
echo -n $d" "; eval $d xprintidle; \
done | sort -n -k 2
DISPLAY=:1 93
DISPLAY=:0 603301
数値は、各ディスプレイのアイドル時間をミリ秒単位で示しています。一番上の行は、最近アクティブな(アイドル状態が最も少ない)ディスプレイを示しています。
それだけの価値があるので、他の答えはどれもうまくいきませんでした。
次のスクリプトは、対応するターミナルがアクティブなときに、ログインしたユーザーのユーザー名とディスプレイ番号をリストします。
w -hs | \
awk -v tty="$(cat /sys/class/tty/tty0/active)" \
'$2 == tty && $3 != "-" {print $1 FS $3}'
結果:
myuser:0