有没有办法找出当前会话用户是否正在运行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
但我正在寻找一种脚本方式。
答案 0 :(得分:53)
我经常需要在运行许多X服务器的服务器上运行X命令,因此基于ps
的答案不起作用。当然,$DISPLAY
必须适当设置。要检查这是否有效,请在某些片段中使用xset q
,如:
if ! xset q &>/dev/null; then
echo "No X server at \$DISPLAY [$DISPLAY]" >&2
exit 1
fi
答案 1 :(得分:17)
$ DISPLAY是标准方式。这就是用户如何与程序进行通信,了解使用哪个X服务器。
答案 2 :(得分:9)
我用
pidof X && echo "yup X server is running"
pgrep和$ DISPLAY是其他选择。
其他考虑因素:
su然后$ DISPLAY将不会被设置。改变程序运行环境的事情可能会导致这种情况无效。
我不推荐ps -e | grep X,因为这将找到procX,它不是X服务器。
答案 3 :(得分:8)
我用来判断X是否正在运行的一个技巧是:
telnet 127.0.0.1 6000
如果它连接,你有一个X服务器正在运行并且它接受入站TCP连接(这些天通常不是默认设置)....
答案 4 :(得分:6)
您可以使用xdpyinfo
(可以通过apt-get install x11-utils
安装)。
答案 5 :(得分:4)
xprop -root &> /dev/null
...是我的尝试和用于测试“X-able”情况的真实命令。并且,它几乎可以保证在任何运行X的系统上运行,当然,如果没有找到命令就会失败,所以即使它不存在,你也可以假设没有X。 (这就是为什么我使用&amp;&gt;而不是&gt;)
答案 6 :(得分:3)
1)
# netstat -lp|grep -i x tcp 0 0 *:x11 *:* LISTEN 2937/X tcp6 0 0 [::]:x11 [::]:* LISTEN 2937/X Active UNIX domain sockets (only servers) unix 2 [ ACC ] STREAM LISTENING 8940 2937/X @/tmp/.X11-unix/X0 unix 2 [ ACC ] STREAM LISTENING 8941 2937/X /tmp/.X11-unix/X0 #
2)nmap
# nmap localhost|grep -i x 6000/tcp open X11 #
答案 7 :(得分:2)
我写了xdpyprobe程序,用于此目的。与xset,xdpyinfo和其他常规工具不同,它不执行任何额外操作(只检查X服务器并退出),它可能不会产生任何输出(如果指定了&#34; -q&#34;选项)。
答案 8 :(得分:1)
首先,您需要确保在服务器上正确安装基础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
答案 9 :(得分:1)
int main()
{
vector<int> a = { 1,2,3,4,5,6 };
vector<int> b(&a[0], &a[5]); // what's wrong? Is it completely wrong this way?
for (int i = 0; i < 6; i++) {
cout << b[i] << endl;
}
return 0;
}
答案 10 :(得分:0)
这是用于检查的PHP脚本。
$xsession = `pidof X`;
if (!$xsession) {
echo "There is no active X session, aborting..\n";
exit;
}
类似的命令也可以在shell脚本中使用。喜欢pidof命令。
答案 11 :(得分:0)
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
您只能为Xorg或系统上的正确命令更改/ usr / lib / Xorg。