Debianシステムの特定のTTYでXが実行されているかどうかを確認し、その場合はディスプレイ番号(DISPLAY値)を検索できますか?
編集:TTYは非アクティブコンソールであり、必ずしもアクティブコンソールである必要はありません。機能を実装しようとしています。
Display()
{
local tty="$1"
...
}
答え1
プロセス名で検索できます。次に、プロセスで開かれたUnixドメインソケット(抽象的かもしれません)を見て、表示された番号を決定します。
pid=$(pgrep -xt "$tty" Xorg) &&
lsof -aUp "$pid" | sed '\|.*X11-unix/X\([0-9]\{1,\}\) .*|!d;s//\1/;q'
lsof
rootとして実行する必要があります。
あるいは、コマンドライン引数から表示番号を抽出することもできます(常に存在する場合)。
pgrep -axt "$tty" Xorg | sed -n 's/.*:\([0-9]\{1,\}\).*/\1/p'
答え2
/dev/ttyNN
私はのマッピングを解決する簡単な方法がわかりません$DISPLAY
。しかし可能です。私のDebianベースのシステムは、次DISPLAY
から実行されているXセッションのローカル値を返します。:0
/dev/tty7
xtty=/dev/tty7
xpid=$(lsof "$xtty" 2>/dev/null | awk '$1 == "Xorg" {print $2}')
test -n "$xpid" && ps -fp "$xpid" | awk '$2 == xpid {print $9}' xpid="$xpid" # → :0
中間段階は次のとおりです。
lsof
指定されたtty端末で開いているすべてのプロセスを返します。awk
というプロセスのプロセスIDを選択しますXorg
。特定のXディスプレイサーバーを実行していない場合はYMMV。lsof /dev/tty7 2>/dev/null COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME Xorg 695 root 8u CHR 4,7 0t0 1059 /dev/tty7
この
ps | awk
組み合わせは、Xorg
一致プロセスに関する十分な詳細を提供することによってDISPLAY
名前を提供します。ps -fp 695 UID PID PPID C STIME TTY TIME CMD root 695 639 0 Jan23 tty7 00:01:44 /usr/bin/X :0 -seat seat0 -auth /var/run/lightdm
答え3
LinuxシステムとGNUツールがあると仮定すると、次のように動作します。
#!/bin/bash
## Get Xorg's tty
xorgTTY="$(ps -o tty= "$(pgrep Xorg)")"
## Get the DISPLAY from a process running on that tty
while read pid; do
display="$(grep -aoP 'DISPLAY=\K[^\0]+' /proc/"$pid"/environ)" && break
done < <(pgrep -t "$xorgTTY")
echo "$display"
答え4
systemd-logind(Debian 8を含める必要があります)を使用しているコンピュータでは、次のようにlogindを照会できます。
DisplayName()
{
local ttynr="$1"
declare -A property
for session in $(loginctl --no-legend list-sessions | awk '{ print $1 }' ); do
while IFS="=" read key value ; do
property[$key]="$value"
done < <(loginctl show-session $session)
if [ "${property[VTNr]}" = "$ttynr" ] && [ -n "${property[Display]}" ]; then
echo "${property[Display]}"
return 0
fi
done
return 1
}