Pregunta pgrep más rápido de lo que lleva iniciar el proceso, ¿usa sleep?


Tengo algunos problemas con mi script CSH y el comando:

set XVFBCHK2 = `pgre -f 'Xvfb' | wc -l`

Parece devolver valores inconsistentes. Cuando debería devolver 1, devuelve 0. Estoy bastante seguro de que hay una función grep demasiado rápida y, por lo tanto, no capta la nueva instancia de Xvfb siguiendo la línea de comando:

Xvfb :1 -screen 0 1600x1200x16 >& /dev/null &

Por ejemplo, en este tramo de script 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

Puedo obtener el siguiente resultado:

       0
       0
       3
       3
       3
       3
       3

Parece que Xvfb se ejecutó tres veces, pero pgrep no captó las ejecuciones hasta la tercera. ¿Cómo me aseguro de que detecta el primer intento o determina con precisión que el primer intento Xvfb: 1 falló y debería intentar Xvfb: 2 a continuación?


2


origen




Respuestas:


Aquí hay una solución que podría funcionar, dependiendo de su implementación de X11 y posiblemente su plataforma.

En Linux con Xorg, obtendrás un archivo (socket en realidad) bajo /tmp/.X11-unix para cada pantalla disponible en localhost. p.ej. Tengo un Xvfb en :2 y una X normal en :0 y obtengo:

$ 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

Entonces, en lugar de intentar comenzar su Xvfbs ciegamente, verifique si la pantalla está disponible con:

if ( -e /tmp/.X11-unix/X$DISP ) then
   ...
endif

Puede usar un ciclo para encontrar el primer número de pantalla disponible.

Es un poco picara, pero debería funcionar en la mayoría de las circunstancias. No estoy seguro de si esto funciona (o si hay soluciones similares) en otros sistemas operativos.


0





así que lo que terminé haciendo y parece funcionar es usar un ciclo while para pgrep para asegurarme de que capte un nuevo proceso:

    set i=0
    while ( $i <= 100 )
            set XVFBCHK2 = `pgrep -f 'Xvfb' | wc -l`
            @ i++
    end

Gracias por tu respuesta Mat. Creo que funcionará muy bien como alternativa para buscar que la pantalla no se use. Tengo otro script para este propósito y tu método es excelente para este propósito.

Resulta que nuestro administrador de clúster no quiere más de una pantalla Xvfb por nodo. Siempre que busque por primera vez que no hay pantallas en ejecución, entonces no necesito preocuparme por encontrar una pantalla que no se esté utilizando. Solo necesito preocuparme por asegurarme de haber tenido éxito en la ejecución de una pantalla Xvfb.


0