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
중간 단계는 다음과 같습니다.
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
}