Найти бесплатный номер дисплея X11 - PullRequest
11 голосов
/ 26 марта 2010

У меня есть несколько модульных тестов, для которых требуется дисплей X11, поэтому я планирую запустить Xvfb перед их запуском, но для запуска Xvfb мне понадобится бесплатный номер дисплея для подключения. Мое лучшее предположение - посмотреть, что бесплатно в /tmp/.X11-unix, но я не уверен, как справиться с гонкой, если много тестов пытаются начать одновременно.

sshd должен это сделать, кто-нибудь знает как?

Ответы [ 5 ]

12 голосов
/ 09 ноября 2011

Почему бы не использовать тот факт, что каждый сервер X11 помещает файл "Lock" в / tmp?

Это называется /tmp/.Xn-lock, где "n" - это идентификатор дисплея. (Также обратите внимание на ведущий в имени файла).

Это механизм, который сам Xserver использует для проверки на дублирование, и он, похоже, работает на всех * nix-платформах, которые я пробовал (HP-UX, Linux, ...)

Чтобы вы могли адаптировать свой скрипт таким образом (извините за синтаксические ошибки, я не привык к C-оболочке, чем сценарии Bourne / Korn)

DISPLAY_NUM=0

do

  if ( -e /tmp/.X$DISPLAY_NUM-lock ) then

     let DISPLAY_NUM=$DISPLAY_NUM+1

  else

     Xvfb :$DISPLAY_NUM -screen 0 1280x1024x24 -ac   (or whatever args take your fancy)

  fi

done
9 голосов
/ 11 августа 2013

С полным кредитом этот ответ на связанный вопрос Насколько высоки цифры дисплея X11? :

Последние X-серверы версии 1.13 (Xvfb тоже) поддерживает параметр командной строки -displayfd <fd>: он заставит X-сервер выбрать сам дисплей и записать номер дисплея обратно в дескриптор файла <fd>.Это немного запутанно, но это был бы безопасный и свободный от гонки способ попросить Xvfb использовать любой бесплатный дисплей.A bash пример:

exec 6>display.log
Xvfb -displayfd 6
# The display number of the new Xvfb instance has been written to display.log 
# Kill Xvfb
exec 6>&-
5 голосов
/ 26 марта 2010

Нет смысла пытаться найти бесплатный номер дисплея. Как вы уже догадались, между моментом, когда вы найдете бесплатный, и временем запуска Xvfb, другой X-сервер мог занять порт, который вы считали свободным. Поэтому лучше просто попытаться запустить Xvfb, обработать ошибку, если порт занят, а затем повторить попытку на следующем порту, пока вы не добьетесь успеха или не исчерпаете порты, чтобы попробовать.

#!/bin/bash
DISPLAY_NUM=0
unset TEST_HAS_RUN
until [ $TEST_HAS_RUN ] || (( $DISPLAY_NUM > 10 ))
do
 Xvfb :$DISPLAY_NUM &
 jobs
 sleep 2  # assumption here is that Xvfb will exit quickly if it can't launch
 if jobs | grep Xvfb
 then  
   echo launching test on :$DISPLAY_NUM
   xterm -display :$DISPLAY_NUM
   TEST_HAS_RUN=1
   kill %-
 else   
   let DISPLAY_NUM=$DISPLAY_NUM+1
 fi
done
1 голос
/ 04 июня 2019

Возможно, немного не по теме, но если вы используете xvfb-run для запуска команды, требующей Xserver, просто запустите

# xvfb-run -a your command

делает трюк.

0 голосов
/ 14 августа 2013

Основано на ответе @karunski.

Использование Xvfb для проверки дисплеев и lsof для проверки, являются ли сокеты Unix в процессе Xvfb, более эффективно, обратите внимание, что sleep 0.5, может быть переменной, зависит от машины.

#!/bin/bash
DISPLAY=0

until [ $DISPLAY_NUM > 10 ]; do
        echo -n "Looking for display on $DISPLAY..."
        Xvfb :$DISPLAY > /dev/null 2>&1 &
        pid=$!
        sleep 0.5
        lsof -a -U -p $pid  > /dev/null 2>&1    

        notfound="$?"
        kill $pid > /dev/null 2>&1

        wait $pid

        [ "$notfound" == "0" ] && echo "found" && break

        echo "fail"
        let DISPLAY=DISPLAY+1
done
...