我有一些单元测试需要X11显示器,所以我计划在运行它们之前启动Xvfb,但要启动Xvfb,我需要一个免费的显示号码来连接它。我最好的猜测是看看/tmp/.X11-unix中有什么是免费的,但如果许多测试试图同时启动,我不确定如何处理竞争。
sshd必须这样做,有人知道怎么做吗?
发布于 2013-08-11 05:40:09
将全部功劳归功于this answer的相关问题How high do X11 display numbers go?
最新的X服务器版本1.13 (Xvfb也是)支持-displayfd <fd>命令行选项:它将使X服务器自己选择显示,并将显示编号写回文件描述符<fd>。这有点令人费解,但这将是一种安全和无竞争条件的方式,要求Xvfb使用任何免费的显示。bash示例:
exec 6>display.log
Xvfb -displayfd 6
# The display number of the new Xvfb instance has been written to display.log
# Kill Xvfb
exec 6>&-发布于 2011-11-09 18:51:49
为什么不利用这样一个事实:每个X11服务器都会在/tmp中放入一个“锁”文件?
这称为/tmp/.Xn-lock,其中"n“是显示id。(还请注意前导。在文件名中)。
这是Xserver本身用来检查重复项的机制,它似乎在我尝试过的所有*nix平台(HP-UX、Linux等)上都是一致的。
所以你可以这样修改你的脚本(请原谅我的语法错误,我更习惯于C shell而不是Bourne/Korn shell脚本)
DISPLAY_NUM=0
do
if ( -e /tmp/.X$DISPLAY_NUM-lock ) then
let DISPLAY_NUM=$DISPLAY_NUM+1
else
Xvfb :$DISPLAY_NUM -screen 0 1280x1024x24 -ac (or whatever args take your fancy)
fi
done发布于 2010-03-26 10:58:58
试图找到一个免费的显示号码是没有意义的。正如您所猜测的那样,在您找到一个空闲端口到Xvfb启动的这段时间内,另一个X服务器可能已经占用了您认为空闲的端口。因此,最好只尝试启动Xvfb,如果端口被占用,则处理失败,然后在下一个端口重试,直到成功或没有可供尝试的端口。
#!/bin/bash
DISPLAY_NUM=0
unset TEST_HAS_RUN
until [ $TEST_HAS_RUN ] || (( $DISPLAY_NUM > 10 ))
do
Xvfb :$DISPLAY_NUM &
jobs
sleep 2 # assumption here is that Xvfb will exit quickly if it can't launch
if jobs | grep Xvfb
then
echo launching test on :$DISPLAY_NUM
xterm -display :$DISPLAY_NUM
TEST_HAS_RUN=1
kill %-
else
let DISPLAY_NUM=$DISPLAY_NUM+1
fi
donehttps://stackoverflow.com/questions/2520704
复制相似问题