获取给定 tty 的显示号码

获取给定 tty 的显示号码

如何查明 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/ttyNNto的映射$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

中间阶段如下。

  1. 返回lsof给定 tty 终端上打开的所有进程。挑选awk出名为 的进程的进程 ID Xorg。 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
    
  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
}

相关内容