如何以编程方式测试是否可以连接到 $DISPLAY 中指定的 X 服务器

如何以编程方式测试是否可以连接到 $DISPLAY 中指定的 X 服务器

这是编程和服务器管理之间的中间地带,但这似乎最终是与它最相关的地方。

我正在寻找一种方法来确定变量“ $DISPLAY”是否正在宣传我们可以实际连接的 XServer,也就是说,是否已完成所有身份验证和其他操作以允许执行进一步的操作。

我理想中寻找的是返回 true/false 的 shell-end 工具,它可以在构建脚本中用于确定是否应该运行其中的其他测试(我无法控制)。

目前的测试只是检查env变量“ $DISPLAY”,如果存在,就会尝试连接,当连接不起作用时,测试会假定测试失败,而不仅仅是显示器无法连接。

我只需要能够做到

if [[ ! can_connect_to_X ]] ; then 
    unset DISPLAY
fi

为了阻止这些测试产生严重的精神问题。

在理想情况下,执行此操作所需的工具应该由 X Client 库本身提供,以免产生特殊依赖性,并且能够假设如果没有该实用程序,我们就无法连接到任何显示器。

答案1

您可以尝试使用 xset 命令:

if [[ ! $(xset -q) ]]; then
   # the X server is not reachable
else
   # the X server is reachable
fi

答案2

我猜有更好的解决方案。但你总是可以使用像 xclock 这样的小工具并检查退出状态。

if [[ ! xclock ]]; then
  exit 1
fi
pkill xclock

但是,丑陋的 :-)

Less Hacky,将以下内容放入 checkX.c 中:

#include <X11/Xlib.h>
#include <stdio.h>

int main() 
{
    Display *display;
    if( ! (display=XOpenDisplay(NULL) ) ) {
        return(1);
    }
    return 0;
}

然后:

gcc -lX11 checkX.c -o checkX
chmod +x checkX

最后:

if ./checkX; then
   echo "We are good to go!"
fi

答案3

这是一种可行的方法,但不确定它有多好。

  x_works(){
     # If there is no xdpyinfo
     # Bash will return 127
     # If X cant connect, it returns 1
     # If X can connect, it returns 0
     xdpyinfo 1>/dev/null 2>&1
     WORKS="$?"
     return $WORKS
  }

  if x_works; then 
   ...

出现正在工作。

相关内容