首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查找免费的X11显示号码

查找免费的X11显示号码
EN

Stack Overflow用户
提问于 2010-03-26 09:48:01
回答 6查看 12.7K关注 0票数 13

我有一些单元测试需要X11显示器,所以我计划在运行它们之前启动Xvfb,但要启动Xvfb,我需要一个免费的显示号码来连接它。我最好的猜测是看看/tmp/.X11-unix中有什么是免费的,但如果许多测试试图同时启动,我不确定如何处理竞争。

sshd必须这样做,有人知道怎么做吗?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 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示例:

代码语言:javascript
复制
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>&-
票数 15
EN

Stack Overflow用户

发布于 2011-11-09 18:51:49

为什么不利用这样一个事实:每个X11服务器都会在/tmp中放入一个“锁”文件?

这称为/tmp/.Xn-lock,其中"n“是显示id。(还请注意前导。在文件名中)。

这是Xserver本身用来检查重复项的机制,它似乎在我尝试过的所有*nix平台(HP-UX、Linux等)上都是一致的。

所以你可以这样修改你的脚本(请原谅我的语法错误,我更习惯于C shell而不是Bourne/Korn shell脚本)

代码语言:javascript
复制
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
票数 11
EN

Stack Overflow用户

发布于 2010-03-26 10:58:58

试图找到一个免费的显示号码是没有意义的。正如您所猜测的那样,在您找到一个空闲端口到Xvfb启动的这段时间内,另一个X服务器可能已经占用了您认为空闲的端口。因此,最好只尝试启动Xvfb,如果端口被占用,则处理失败,然后在下一个端口重试,直到成功或没有可供尝试的端口。

代码语言:javascript
复制
#!/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
done
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2520704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档