Questão pgrep mais rápido do que demora para iniciar o processo, use o modo de suspensão?


Estou tendo alguns problemas com meu script CSH e o comando:

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

Parece retornar valores inconsistentes. Quando ele deve retornar 1, ele retorna 0. Tenho certeza de que existe uma função grep muito rápida e, portanto, não captura a nova instância do Xvfb seguindo a linha de comando:

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

Por exemplo, neste trecho do 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

Eu posso obter a seguinte saída:

       0
       0
       3
       3
       3
       3
       3

Portanto, parece que o Xvfb foi executado três vezes, mas o pgrep não detectou as execuções até o terceiro. Como faço para garantir que ele detecta a primeira tentativa ou determina com precisão que a primeira tentativa Xvfb: 1 falhou e deve tentar Xvfb: 2 em seguida?


2


origem




Respostas:


Aqui está uma solução alternativa que poderia funcionar, dependendo da sua implementação do X11 e, possivelmente, da sua plataforma.

No Linux com o Xorg, você obterá um arquivo (socket na verdade) sob /tmp/.X11-unix para cada exibição disponível no host local. por exemplo. Eu tenho um Xvfb em :2 e um X normal ligado :0 e eu recebo:

$ 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

Então, ao invés de tentar iniciar o seu Xvfbs cegamente, verifique se a exibição está disponível com:

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

Você poderia usar um loop para encontrar o primeiro número de exibição disponível.

É um pouco atrevido, mas deve funcionar na maioria das circunstâncias. Não tenho certeza se isso funciona (ou se existem soluções alternativas semelhantes) em outros sistemas operacionais.


0





Então, o que acabei fazendo e parece funcionar é usar um loop while para o pgrep para ter certeza de que ele captura um novo processo:

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

Obrigado pela sua resposta Mat. Eu acho que funcionará muito bem como uma alternativa para procurar a exibição que não está sendo usada. Eu tenho outro script para essa finalidade e seu método é ótimo para essa finalidade.

Acontece que o nosso administrador de cluster não quer mais do que um display Xvfb por nó. Desde que pesquise primeiro que não há exibições em execução, não preciso me preocupar em encontrar um monitor que não esteja sendo usado. Eu só preciso me preocupar em ter certeza de que fui bem sucedido em executar um display Xvfb.


0