我的 CSH 脚本和命令存在一些问题:
set XVFBCHK2 = `pgre -f 'Xvfb' | wc -l`
它似乎返回了不一致的值。当它应该返回 1 时,它却返回了 0。我确信 grep 函数太快了,因此无法捕获命令行后面的 Xvfb 新实例:
Xvfb :1 -screen 0 1600x1200x16 >& /dev/null &
例如,在这段 CSH 脚本中:
if ( $XVFBCHK == 0 && $FIJICHK == 0 ) then
set DISP=0
set SCREEN=0
Xvfb :1 -screen 0 1600x1200x16 >& /dev/null &
set XVFBCHK2 = `pgrep -f 'Xvfb' | wc -l`
echo $XVFBCHK2
if ( $XVFBCHK2 == 1 ) then
set DISP=1
set SCREEN=0
else if ( $XVFBCHK2 == 0 ) then
Xvfb :2 -screen 0 1600x1200x16 >& /dev/null &
set DISP=2
set SCREEN=0
endif
set XVFBCHK2 = `pgrep -f 'Xvfb' | wc -l`
echo $XVFBCHK2
if ( $XVFBCHK2 == 0 ) then
Xvfb :3 -screen 0 1600x1200x16 >& /dev/null &
set DISP=3
set SCREEN=0
endif
set XVFBCHK2 = `pgrep -f 'Xvfb' | wc -l`
echo $XVFBCHK2
if ( $XVFBCHK2 == 0 ) then
Xvfb :4 -screen 0 1600x1200x16 >& /dev/null &
set DISP=4
set SCREEN=0
endif
set XVFBCHK2 = `pgrep -f 'Xvfb' | wc -l`
echo $XVFBCHK2
if ( $XVFBCHK2 == 0 ) then
Xvfb :5 -screen 0 1600x1200x16 >& /dev/null &
set DISP=5
set SCREEN=0
endif
set XVFBCHK2 = `pgrep -f 'Xvfb' | wc -l`
echo $XVFBCHK2
setenv DISPLAY :$DISP.$SCREEN
elseif
echo $XVFBCHK2
echo $DISP
我可以得到以下输出:
0
0
3
3
3
3
3
因此,看起来 Xvfb 执行了三次,但 pgrep 直到第三次才捕获执行。我如何确保它捕获第一次尝试或准确确定第一次尝试 Xvfb :1 失败并且它应该接下来尝试 Xvfb :2?
答案1
这是一个可行的解决方法,取决于您对 X11 的实现以及可能的平台。
在装有 Xorg 的 Linux 上,您将获得本地主机上每个可用显示器的文件(实际上是套接字)/tmp/.X11-unix
。例如,我打开了一个 Xvfb:2
和一个普通 X :0
,然后我得到:
$ ls -l /tmp/.X11-unix
total 0
srwxrwxrwx 1 root root 0 Oct 4 09:06 X0
srwxrwxrwx 1 root root 0 Oct 4 11:37 X2
因此,不要盲目地尝试启动Xvfb
s,而是使用以下命令检查显示是否可用:
if ( -e /tmp/.X11-unix/X$DISP ) then
...
endif
您可以使用循环来查找第一个可用的显示号码。
这有点不雅,但在大多数情况下应该可以工作。不确定这在其他操作系统上是否有效(或者是否有类似的解决方法)。
答案2
所以我最终做的并且似乎有效的是对 pgrep 使用一个 while 循环,以便确保它捕获一个新进程:
set i=0
while ( $i <= 100 )
set XVFBCHK2 = `pgrep -f 'Xvfb' | wc -l`
@ i++
end
谢谢你的回答,Mat。我认为这将是一个很好的选择,可以替代搜索未使用的显示。我有另一个用于此目的的脚本,你的方法非常适合此目的。
事实证明,我们的集群管理员希望每个节点最多只有一个 Xvfb 显示器。只要我首先搜索没有正在运行的显示器,那么我就不必担心找到未使用的显示器。我只需要担心确保我成功执行了 Xvfb 显示器。