Comment puis-je tester par programme s'il est possible de se connecter au serveur X spécifié dans $ DISPLAY

8

C'est un peu à mi-chemin entre la programmation et l'administration du serveur, mais cela semble finalement l'endroit le plus pertinent pour cela.

Je cherche un moyen de déterminer si la variable ' $DISPLAY' annonce un XServer auquel nous pouvons réellement nous connecter, c'est-à-dire si toute l'authentification et tout le reste est en place pour permettre à d'autres choses de s'exécuter.

Je suis idéalement à la recherche d'un outil shell-end qui renvoie true / false, qui peut être utilisé dans un script de build pour déterminer si les autres tests qu'il contient (que je ne contrôle pas) doivent être exécutés ou non.

À l'heure actuelle, les tests vérifient simplement la envvariable " $DISPLAY", et si elle est là, ils essaieront de se connecter, et lorsque la connexion ne fonctionne pas, les tests supposent l'échec du test, et non simplement l'affichage n'est pas connectable.

J'ai juste besoin de pouvoir faire

if [[ ! can_connect_to_X ]] ; then 
    unset DISPLAY
fi

Afin d'arrêter ces tests ayant de graves problèmes mentaux.

Dans une situation idéale, l'outil requis pour ce faire devrait être fourni avec les bibliothèques X Client lui-même, afin de ne pas encourir de dépendances spéciales et de pouvoir supposer que si l'utilitaire n'est pas là, nous ne pouvons pas nous connecter à aucun affichage.

Kent Fredric
la source

Réponses:

6

Vous pouvez essayer avec la commande xset:

if [[ ! $(xset -q) ]]; then
   # the X server is not reachable
else
   # the X server is reachable
fi
slubman
la source
Bien que j'ai fini par l'utiliser d'une manière plus complexe, xset semble être plus probablement installé que xdpyinfo.
Kent Fredric
2

Je suppose qu'il y a une meilleure solution. Mais vous pouvez toujours simplement utiliser un petit outil comme xclock et vérifier l'état de sortie.

if [[ ! xclock ]]; then
  exit 1
fi
pkill xclock

Mais l' homme, qui est laid :-)

Moins Hacky, mettez ce qui suit dans checkX.c:

#include <X11/Xlib.h>
#include <stdio.h>

int main() 
{
    Display *display;
    if( ! (display=XOpenDisplay(NULL) ) ) {
        return(1);
    }
    return 0;
}

Alors:

gcc -lX11 checkX.c -o checkX
chmod +x checkX

Enfin:

if ./checkX; then
   echo "We are good to go!"
fi
Kyle Brandt
la source
Oui, c'est la première chose que j'ai envisagée, mais je voulais quelque chose qui ne crée pas visuellement une fenêtre: /. J'ai même envisagé de faire xclock & puis de le tuer.
Kent Fredric
xclock -geometry 1x1 est à peu près le meilleur que je puisse faire pour éliminer les intrusions visuelles: /, mais il alloue également un espace de tâches sur la barre des tâches :(
Kent Fredric
C'est le premier programme X que j'ai jamais écrit en C, donc, je ne sais pas s'il est entièrement fiable :-)
Kyle Brandt
Et pas la chose la plus portable ;-)
Kyle Brandt
C'est assez pratique, malheureusement, mes contraintes sont un peu plus strictes. À vrai dire, j'écris un ebuild (gentoo), donc je dois pratiquement faire / tout / dans le shell, et supposer que les applications seront là avant la main et je ne peux pas simplement ajouter des blobs binaires à l'avance aux applications tierces :)
Kent Fredric
1

Voici un possible WayToDoIt, je ne sais pas à quel point c'est bon.

  x_works(){
     # If there is no xdpyinfo
     # Bash will return 127
     # If X cant connect, it returns 1
     # If X can connect, it returns 0
     xdpyinfo 1>/dev/null 2>&1
     WORKS="$?"
     return $WORKS
  }

  if x_works; then 
   ...

Cela semble fonctionner.

Kent Fredric
la source
Sur ma machine Fedora 11, je reçois: $ xdpyinfo 1 utilisation: xdpyinfo [options] Quoi qu'il en soit, je pense que cela semble être une bonne idée d'utiliser le programme xdpyinfo.
Cristian Ciupitu
le '1' il y a une redirection stderr pour bash;), pas un paramètre xdpyinfo :)
Kent Fredric