与えられたttyの表示番号を取得します

与えられたttyの表示番号を取得します

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'

lsofrootとして実行する必要があります。

あるいは、コマンドライン引数から表示番号を抽出することもできます(常に存在する場合)。

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

中間段階は次のとおりです。

  1. 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
    
  2. この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
}

関連情報