web-dev-qa-db-ja.com

現在の(アクティブな)XServer DISPLAY番号を見つける方法は?

私は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番号を確認する方法は?現在のように、複数のサーバー(複数のユーザー)を持つことができます。

4
Geyslan G. Bem

まあ、私が現在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変数を見つけると、リストの反復を停止し、結果をechosします。

これにより、スクリプトを実行するアクティブなディスプレイが印刷されます。

4
Geyslan G. Bem

これは他の答えに基づいた私の解決策です:

#!/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セッションであることを確認できます。それ以外の場合は、最初のセッションを使用します。

このスクリプトは、必要に応じて、現在のユーザーにも一致するように拡張できます。

1
Adam Wallner

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

数値は、各ディスプレイのアイドル時間をミリ秒単位で示しています。一番上の行は、最近アクティブな(アイドル状態が最も少ない)ディスプレイを示しています。

それだけの価値があるので、他の答えはどれもうまくいきませんでした。

1
Metamorphic

次のスクリプトは、対応するターミナルがアクティブなときに、ログインしたユーザーのユーザー名とディスプレイ番号をリストします。

w -hs | \
awk -v tty="$(cat /sys/class/tty/tty0/active)" \
    '$2 == tty && $3 != "-" {print $1 FS $3}'

結果:

myuser:0

1