如何检查X服务器是否正在运行?

Rom*_*n M 59 linux x11 xserver

有没有办法找出当前会话用户是否正在运行Xserver(在Linux下)?

我开始做的事情如下:

ps -e | grep X 
Run Code Online (Sandbox Code Playgroud)

但这并不总是有效

我尝试的另一件事是检查$DISPLAY变量

有没有其他方法来检查这个?

编辑:有人建议使用$ DISPLAY变量,但如果用户摆弄这个变量怎么办?如果他试图做某事并改变这个变量然后当我检查它时,它不再反映系统的准确状态.有没有具体的方法来做到总会得到正确的答案?

我发现它可以以编程方式完成:

#include <X11/Xlib.h> 
int main()
    { exit(XOpenDisplay(NULL) ? 0 : 1);  } 

$ gcc -o xprobe xprobe.c -L/usr/X11R6/lib -lX11 
Run Code Online (Sandbox Code Playgroud)

但我正在寻找一种脚本方式.

bob*_*ogo 57

我经常需要在运行许多X服务器的服务器上运行X命令,因此ps基础答案不起作用.当然,$DISPLAY必须适当设置.要检查它是否有效,请使用以下xset q某些片段:

if ! xset q &>/dev/null; then
    echo "No X server at \$DISPLAY [$DISPLAY]" >&2
    exit 1
fi
Run Code Online (Sandbox Code Playgroud)

  • @will 这种挂起不会特定于 `xset`。任何 X 程序都会受到影响。挂起取决于 X 传输。如果你说`DISPLAY=:1`,这意味着tcp 端口6001。你可能有一些rouge 进程在监听。我的 `xset` 在没有任何内容时立即返回。 (2认同)

Ken*_*Ken 17

$ DISPLAY是标准方式.这就是用户如何与程序进行通信,了解使用哪个X服务器(如果有的话).

  • 我的意思是,如果有一个在localhost上运行,但他们将$ DISPLAY设置为另一台服务器,因为它们是远程登录的,你还想要"本地"服务器吗?如果有多个本地的怎么办?我不知道你是怎么发现的,或者你想要的原因.$ DISPLAY存在是有原因的. (4认同)
  • 如果我设置$ DISPLAY,那是因为我希望你的程序转到另一个显示器.您想要猜测用户显式配置的用例究竟是什么?你是否避免使用$ HOME以防用户"摆弄"它?它在哪里结束? (2认同)
  • 确切地说,您想要访问哪个X服务器?我有很多次不得不在远程系统上安装驱动程序.此外,在POSIX中,XOpenDisplay(NULL)被定义为简单地读取$ DISPLAY,所以最好听起来像是在指望非标准行为. (2认同)
  • 在Windows(WSL)下,我想测试X是否已经在运行。换句话说,我想测试因为我想设置DISPLAY。我可以重新表述一下 DISPLAY 是由假设它知道 X 正在运行的东西设置的,它与它实际运行的事实无关。 (2认同)

Ian*_*ing 9

我用

pidof X && echo "yup X server is running"
Run Code Online (Sandbox Code Playgroud)

pgrep和$ DISPLAY是其他选项.

其他考虑:

su然后$ DISPLAY将不会被设置.改变程序运行环境的事情会使这不起作用.

我不推荐ps -e | grep X因为这会找到procX,它不是X服务器.


dic*_*oce 8

我用来判断X是否正在运行的一个技巧是:

telnet 127.0.0.1 6000

如果它连接,你有一个X服务器正在运行,它接受入站TCP连接(这些天通常不是默认的)....

  • 具有安全意识的系统也不会侦听 TCP 端口,但会仅限于 Unix 域套接字,从而进一步使此方法无效。 (2认同)

shu*_*ckc 8

您可以使用xdpyinfo(可以通过安装apt-get install x11-utils).


osi*_*hra 6

xprop -root &> /dev/null 
Run Code Online (Sandbox Code Playgroud)

...是我尝试过的测试“X-able”情况的真实命令。而且,它几乎可以保证在任何运行 X 的系统上,当然,如果没有找到该命令就会失败,所以即使它不存在,您也几乎可以假设没有 X。(这就是我使用 &> 而不是 > 的原因)

  • 在不支持`&amp;&gt;`的`dash`下运行的shell脚本中使用`&amp;&gt;`,可以使用`&gt;/dev/null 2&gt;&amp;1`。 (3认同)
  • 在 cygwin 上安装 X 的典型方法是安装包 `xinit`。因此,`xprop` 不会自动安装,因为它不是依赖项。 (2认同)