12
votes

Trouver un numéro d'affichage X11 gratuit

J'ai des tests unitaires qui ont besoin d'un affichage X11, donc je prévois de démarrer XVFB avant de les exécuter, mais de démarrer XVFB, j'aurai besoin d'un numéro d'affichage gratuit pour la connecter. Ma meilleure hypothèse est de voir ce qui est gratuit dans /tmp/.x11-unix mais je ne sais pas comment gérer la course si de nombreux tests essaient de démarrer simultanément.

sshd doit faire cela, quelqu'un sait-il comment?

x11

0 commentaires

6 Réponses :


5
votes

Il ne sert à rien d'essayer de trouver un numéro d'affichage gratuit. Comme vous l'avez deviné, entre le moment où vous trouverez une entreprise gratuite et le temps XVFB démarre, un autre serveur X aurait pu prendre le port que vous pensiez être gratuit. Donc, mieux d'essayer d'essayer de lancer XVFB, gérez l'échec si le port est pris, puis réessayez au port suivant jusqu'à ce que vous réussissez ou manquez de ports pour essayer.

#!/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


3 commentaires

Si xterm lance avec succès, ne bloquez pas votre script tant que l'utilisateur la sort manuellement? Sinon, il semble que test_has_run ne soit jamais défini, et la boucle ne cesse jamais. En fait, il ressemble à votre test passes si xterm ne parvient pas à lancer. Est-ce que je manque quelque chose?


Techniquement, si XVFB échoue puis dans votre sommeil de 2 secondes, un autre serveur X prend le port, votre test passerait sur le mauvais serveur (en particulier si votre script a un autre XVFB en arrière-plan pour satisfaire Emplois | grep xvfb ). Il serait préférable de lancer XVFB avec un Unique FBDIR (par exemple, -fbdir / var / tmp / 0 $ € $$. $ Random ), puis vérifiez le fichier < Code> xvfb_screen0 dans ce répertoire.


@Jrodatus Cette réponse suppose "xterm" est le test, il est donc correct que l'affichage se ferme après cela. Et une autre instance racant à ce sujet ne trouverait pas le mauvais serveur car "emplois" ne signale que les enfants de cette coquille. La réponse de Krlmlr est maintenant meilleure, cependant.



11
votes

Pourquoi ne pas exploiter le fait que chaque serveur X11 met un fichier "verrouillage" dans / tmp?

Ceci s'appelle /tmp/.xn-lock où "N" est l'identifiant d'affichage. (Notez également le meneur. Dans le nom de fichier). P>

Il s'agit du mécanisme que XServer utilise elle-même pour vérifier la duplication, et il semble être cohérent sur toutes les plateformes * NIX que j'ai essayées (HP-UX, Linux, ...) p>

Vous pouvez ainsi adapter votre script ainsi (pardonnez-moi pour des erreurs de syntaxe, je suis noré habitué à c shell que Script Shell de Bourne / Korn) P>

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


3 commentaires

Une partie de la question était de savoir comment éviter les courses. Votre code échouera également finalement s'il est exécuté simultanément.


Vous pouvez aider à éviter les courses avec une serrure personnalisée supplémentaire - par exemple pour mettre tout cela à l'intérieur d'un autre troupeau. Cela a fonctionné pour moi (mieux, que la réponse acceptée réelle).


J'ai ajouté une nouvelle réponse ci-dessous qui fonctionne pour moi Stackoverflow.com/a/68128883/101152



13
votes

avec crédit complet à Cette réponse à la question associée A quelle distance les numéros d'affichage X11 vont-ils? :

Serveurs X récents à la version 1.13 ( XVFB , aussi) Supporte le -Displayfd < FD> Option de ligne de commande: Il créera que le serveur X choisit l'affichage lui-même et écrivez le numéro d'affichage dans le descripteur de fichier . C'est un peu compliqué, mais ce serait un moyen sans danger et sans condition de demander au XVFB d'utiliser n'importe quel affichage gratuit. Un bash Exemple: xxx


1 commentaires

Juste une note: dans Debian XVFB V1.14 est disponible dans jessie , cela signifie que la distribution moyenne devrait être assez récente (2e semestre 2013 ou ultérieure).



0
votes

Basé dans la réponse de @karunski.

Utilisation de XVFB pour sonder les affichages et LSOF Pour vérifier si les prises UNIX du processus XVFB sont plus efficaces, sont plus efficaces, remarquez le 0.5 code>, peut être variable dépend de la machine. P >

#!/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


0 commentaires

1
votes

éventuellement un peu hors sujet, mais si vous utilisez xvfb-exécuté code> pour démarrer votre commande XServer-Base, alors exécutez simplement

# xvfb-run -a your command


0 commentaires

0
votes

Ceci a fonctionné pour moi (note - utilise bash) xxx

Notez que le verrouillage de l'extérieur ne fonctionne que lorsque tous les scripts qui exécutent la commande XVFB l'utilisent, sinon vous obtenez des conditions de course à nouveau


0 commentaires