주어진 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'

lsof루트로 실행해야 합니다 .

또는 명령줄 인수에서 표시 번호를 추출할 수 있습니다(항상 존재하는 경우).

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
}

관련 정보