2

У меня проблемы с моим скриптом 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 затем?

2 ответа2

0

так что я закончил тем, что делал и, кажется, работал - использовать цикл while для pgrep, чтобы я мог убедиться, что он перехватывает новый процесс:

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

Спасибо за ваш ответ Мат. Я думаю, что это будет отлично работать в качестве альтернативы поиску неиспользуемого дисплея. У меня есть другой сценарий для этой цели, и ваш метод отлично подходит для этой цели.

Оказывается, нашему администратору кластера требуется не более одного дисплея Xvfb на узел. Пока я сначала ищу, что не работает ни один дисплей, мне не нужно беспокоиться о том, что дисплей не используется. Мне просто нужно побеспокоиться о том, чтобы убедиться, что я успешно выполнил показ Xvfb.

0

Вот обходной путь, который может сработать, в зависимости от вашей реализации X11 и, возможно, вашей платформы.

В Linux с Xorg вы получите файл (на самом деле сокет) в /tmp/.X11-unix для каждого дисплея, доступного на localhost. Например, у меня есть один 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 вслепую, проверьте, доступен ли дисплей с помощью:

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

Вы можете использовать цикл, чтобы найти первый доступный номер дисплея.

Это немного странно, но должно работать в большинстве случаев. Не уверен, что это работает (или если есть аналогичные обходные пути) в других операционных системах.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .