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

问题描述 投票:0回答:13

有什么方法可以查明当前会话用户是否正在运行 Xserver(Linux 下)?

我从以下事情开始:

ps -e | grep X 

但这并不总是有效

我尝试的另一件事是检查

$DISPLAY
变量

还有其他方法可以检查吗?

编辑:

有些人建议使用

$DISPLAY
变量,但是如果用户摆弄这个变量怎么办?如果他尝试做某事并更改此变量,然后当我检查它时,它不再反映系统的准确状态怎么办? 是否没有特定的方法可以始终返回正确的答案?

我发现它可以通过编程来完成:

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

$ gcc -o xprobe xprobe.c -L/usr/X11R6/lib -lX11 

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

linux x11 xserver
13个回答
86
投票

我经常需要在运行许多 X 服务器的服务器上运行 X 命令,因此基于

ps
的答案不起作用。当然,
$DISPLAY
必须适当设置。要检查其是否有效,请在某些片段中使用
xset q
,例如:

if ! xset q &>/dev/null; then
    echo "No X server at \$DISPLAY [$DISPLAY]" >&2
    exit 1
fi

编辑

有些人发现 xset 可能会暂停一段烦人的时间,然后才确定

$DISPLAY
没有指向有效的 X 服务器(通常当 tcp/ip 是传输时)。当然,解决方法是使用 timeout 来保持暂停的顺从性,例如 1 秒。

if ! timeout 1s xset q &>/dev/null; then
    ⋮

22
投票

$DISPLAY 是标准方式。 这就是用户与程序沟通要使用哪个 X 服务器(如果有)的方式。


9
投票

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

远程登录127.0.0.1 6000

如果连接成功,则说明您有一个正在运行的 X 服务器,并且它接受入站 TCP 连接(目前通常不是默认设置)....


9
投票

您可以使用

xdpyinfo
(可以通过
apt-get install x11-utils
安装)。


8
投票

我用

pidof X && echo "yup X server is running"

pgrep 和 $DISPLAY 是其他选项。

其他注意事项:

su 那么 $DISPLAY 将不会被设置。改变程序运行环境的事情可能会使其不起作用。

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


6
投票
xprop -root &> /dev/null 

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


4
投票

我编写了 xdpyprobe 程序就是为了这个目的。 与 xset、xdpyinfo 和其他通用工具不同,它不执行任何额外操作(仅检查 X 服务器并退出),并且可能不会产生任何输出(如果指定了“-q”选项)。


4
投票

bash脚本解决方案:

if ! xset q &>/dev/null; then
    echo "No X server at \$DISPLAY [$DISPLAY]" >&2
    exit 1
fi

如果您从另一个控制台(Ctrl+Alt+F?)或 ssh 登录,则不起作用。对我来说,这个解决方案适用于我的 Archlinux:

#!/bin/sh
ps aux|grep -v grep|grep "/usr/lib/Xorg"
EXITSTATUS=$?
if [ $EXITSTATUS -eq 0 ]; then
  echo "X server running"
  exit 1
fi

您可以仅将 /usr/lib/Xorg 更改为 Xorg 或系统上的正确命令。


2
投票

1)

# netstat -lp|grep -i x
tcp 0 0 *:x11 *:* 监听 2937/X          
tcp6 0 0 [::]:x11 [::]:* 听 2937/X          
活动 UNIX 域套接字(仅限服务器)
unix 2 [ ACC ] 流监听 8940 2937/X @/tmp/.X11-unix/X0
unix 2 [ ACC ] 流监听 8941 2937/X /tmp/.X11-unix/X0
#

2)nmap

# nmap localhost|grep -i x
6000/tcp 打开 X11
#

2
投票

首先您需要确保基础 X11 软件包已正确安装在您的服务器上:

rpm -qa | grep xorg-x11-xauth

如果没有,请安装所有软件包:

sudo yum install xorg-x11-xauth xterm

确保 openssh 服务器配置为转发 x11 连接:

edit file : vim /etc/ssh/sshd_config

X11Forwarding yes

注意:如果该行前面有注释 (#) 或设置为 no,请更新文件以匹配上述内容,然后重新启动 ssh 服务器守护程序(此处要小心 - 如果您犯了错误,您可能会将自己锁定在外)服务器)

sudo /etc/init.d/sshd restart

现在,配置 SSH 应用程序以转发 X11 请求:

ssh -Y your_username@your_server.your_domain.com

1
投票
if [[ $DISPLAY ]]; then 
  …
fi

0
投票

这是用于检查的 PHP 脚本。

$xsession = `pidof X`;
if (!$xsession) {
    echo "There is no active X session, aborting..\n";
    exit;
}

类似的命令也可以在 shell 脚本中使用。就像 pidof 命令一样。


0
投票

其他答案都不是在这十年(2020 年代)写的,其中大多数都过于复杂或只是简单奇怪且不起作用,并且没有一个针对 Wayland 进行测试。

这里有一个更好的解决方案:

ps aux | grep -e 'wayland\|Xorg' | grep -v grep

这会搜索 Xwayland 或 Xorg 并删除误报

grep
搜索。它还会找到独立的
wayland
Xwayland

© www.soinside.com 2019 - 2024. All rights reserved.