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

2

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

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

Parece retornar valores inconsistentes. Quando deve retornar 1, 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

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?

    
por sebastian 04.10.2011 / 08:48

2 respostas

0

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) abaixo de /tmp/.X11-unix para cada exibição disponível no localhost. por exemplo. Eu tenho um Xvfb em :2 e um X normal em :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, em vez de tentar iniciar seu Xvfb s cegamente, verifique se a exibição está disponível com:

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

Você pode 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.

    
por 04.10.2011 / 11:47
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. 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 nosso administrador de cluster não deseja mais do que uma exibição 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 uma exibição Xvfb.

    
por 04.10.2011 / 20:25

Tags