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 sshd doit faire cela, quelqu'un sait-il comment? p> /tmp/.x11-unix code> mais je ne sais pas comment gérer la course si de nombreux tests essaient de démarrer simultanément. P>
6 Réponses :
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
Si xterm code> lance avec succès, ne bloquez pas votre script tant que l'utilisateur la sort manuellement? Sinon, il semble que
test_has_run code> ne soit jamais défini, et la boucle ne cesse jamais. En fait, il ressemble à votre test passes i> si
xterm code> 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 code>). Il serait préférable de lancer XVFB avec un Unique B> FBDIR (par exemple,
-fbdir / var / tmp / 0 $ € $$. $ Random code>), puis vérifiez le fichier < Code> xvfb_screen0 code> 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.
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
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
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 code>, aussi) Supporte le
-Displayfd < FD> Code> 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
XVFB code> d'utiliser n'importe quel affichage gratuit. Un
bash code> Exemple: p>
Juste une note: dans Debian XVFB CODE> V1.14 est disponible dans
jessie code>
, cela signifie que la distribution moyenne devrait être assez récente (2e semestre 2013 ou ultérieure).
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
é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
Ceci a fonctionné pour moi (note - utilise bash) 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 p> p>