如何查明 X 是否正在 Debian 计算机上的给定 TTY 上运行,并在这种情况下检索显示编号(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
to的映射$DISPLAY
。然而,这是可能的。在我的基于 Debian 的系统上,这将返回运行在以下位置的 X 会话的本地DISPLAY
值::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
出名为 的进程的进程 IDXorg
。 YMMV 如果您没有运行特定的 X 显示服务器。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
}