pgrep 的速度比启动进程的速度快,使用睡眠吗?

pgrep 的速度比启动进程的速度快,使用睡眠吗?

我的 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

因此,不要盲目地尝试启动Xvfbs,而是使用以下命令检查显示是否可用:

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 显示器。

相关内容