82

有什么方法可以查明当前会话用户是否正在运行 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 

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

4

12 回答 12

76

我经常需要在运行许多 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 是传输时)。当然,解决方法是使用超时来保持暂停,例如 1 秒。

if ! timeout 1s xset q &>/dev/null; then
    ⋮
于 2012-08-15T07:52:41.157 回答
17

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

于 2009-03-12T01:38:21.400 回答
9

我用

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

pgrep 和 $DISPLAY 是其他选项。

其他注意事项:

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

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

于 2009-03-12T01:23:55.540 回答
9

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

远程登录 127.0.0.1 6000

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

于 2009-03-12T01:48:35.837 回答
9

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

于 2013-06-14T15:23:37.650 回答
6
xprop -root &> /dev/null 

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

于 2014-10-27T15:56:44.903 回答
4

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

于 2016-04-03T05:12:52.680 回答
3

1)

# netstat -lp|grep -ix
tcp 0 0 *:x11 *:* 听 2937/X          
tcp6 0 0 [::]:x11 [::]:* LISTEN 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 本地主机|grep -ix
6000/tcp 打开 X11
#
于 2009-03-12T08:53:45.893 回答
3

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 或系统上的正确命令。

于 2019-01-04T22:09:15.880 回答
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
于 2017-01-25T08:22:05.620 回答
1
if [[ $DISPLAY ]]; then 
  …
fi
于 2017-10-16T20:03:06.100 回答
0

这是用于检查的 PHP 脚本。

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

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

于 2016-10-17T10:21:05.347 回答