有什么方法可以查明当前会话用户是否正在运行 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
但我正在寻找一种脚本方式。
我经常需要在运行许多 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
⋮
$DISPLAY 是标准方式。 这就是用户与程序沟通要使用哪个 X 服务器(如果有)的方式。
我用来判断 X 是否正在运行的一个技巧是:
远程登录127.0.0.1 6000
如果连接成功,则说明您有一个正在运行的 X 服务器,并且它接受入站 TCP 连接(目前通常不是默认设置)....
您可以使用
xdpyinfo
(可以通过apt-get install x11-utils
安装)。
我用
pidof X && echo "yup X server is running"
pgrep 和 $DISPLAY 是其他选项。
其他注意事项:
su 那么 $DISPLAY 将不会被设置。改变程序运行环境的事情可能会使其不起作用。
我不推荐 ps -e | grep X,因为这会找到 procX,它不是 X 服务器。
xprop -root &> /dev/null
...是我尝试过的真实命令,用于测试“X-able”情况。而且,它几乎可以保证在任何运行 X 的系统上,当然,如果无论如何都找不到该命令,该命令就会失败,所以即使它不存在,您也几乎可以假设也不存在 X。 (这就是为什么我使用 &> 而不是 >)
我编写了 xdpyprobe 程序就是为了这个目的。 与 xset、xdpyinfo 和其他通用工具不同,它不执行任何额外操作(仅检查 X 服务器并退出),并且可能不会产生任何输出(如果指定了“-q”选项)。
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 或系统上的正确命令。
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 #
首先您需要确保基础 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
if [[ $DISPLAY ]]; then
…
fi
这是用于检查的 PHP 脚本。
$xsession = `pidof X`;
if (!$xsession) {
echo "There is no active X session, aborting..\n";
exit;
}
类似的命令也可以在 shell 脚本中使用。就像 pidof 命令一样。
其他答案都不是在这十年(2020 年代)写的,其中大多数都过于复杂或只是简单奇怪且不起作用,并且没有一个针对 Wayland 进行测试。
这里有一个更好的解决方案:
ps aux | grep -e 'wayland\|Xorg' | grep -v grep
这会搜索 Xwayland 或 Xorg 并删除误报
grep
搜索。它还会找到独立的 wayland
和 Xwayland
。