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


8

这在编程和服务器管理之间有点中间立场,但这似乎最终是最相关的地方。

我正在寻找一种确定变量' $DISPLAY'是否正在宣传我们实际上可以连接的XServer的方法,也就是说,是否所有身份验证和适当的条件都可以执行。

理想情况下,我正在寻找一种返回true / false的shell端工具,可以在构建脚本中使用它来确定是否应该运行其中的其他测试(我不控制)。

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

我只需要能够做

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

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

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

Answers:



2

我猜有更好的解决方案。但是,您始终可以只使用xclock之类的小工具并检查退出状态。

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

但是男人,那就是丑:-)

减少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

是的,这是我考虑的第一件事,但是我想要的东西并不是在视觉上创建窗口的:/。我什至考虑过做xclock&然后杀死它。
肯特·弗雷德里克

xclock -geometry 1x1是我能做的最好的消除视觉干扰的方法:/,但是它还在任务栏上分配了一个任务空间:(
Kent Fredric

那是我用C编写的第一个X程序,所以,不确定它是否完全可靠:-)
Kyle Brandt

并不是最便携的东西;-)
凯尔·布​​兰特

这非常方便,只是不幸的是,我的约束更加严格了。说实话,我正在写一个ebuild(gentoo),所以我实际上要在shell中做/ everything /,并假设应用程序会在那儿,我不能只向3rd party应用程序提前添加二进制blob。 :)
肯特·弗雷德里克

1

这是一个可能的WayToDoIt,虽然不确定它有多好。

  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 
   ...

似乎正在工作。


在我的Fedora 11机器上,我得到:$ xdpyinfo 1用法:xdpyinfo [options]无论如何,我认为使用xdpyinfo程序听起来是个好主意。
Cristian Ciupitu 09年

'1'是bash的stderr重定向;),而不是xdpyinfo参数:)
Kent Fredric,2009年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.