¿Cómo pruebo mediante programación si es posible conectarse al servidor X especificado en $ DISPLAY

8

Este es un punto intermedio entre la programación y el servidor-administrador, pero en última instancia, parece ser el lugar más relevante para ello.

Estoy buscando una manera de determinar si la variable ' $DISPLAY' está anunciando un XServer al que realmente podemos conectarnos, es decir, si toda la autenticación y demás están en su lugar para permitir que se ejecuten más cosas.

Lo ideal es buscar una herramienta de shell que devuelva verdadero / falso, que pueda usarse en un script de compilación para determinar si las otras pruebas (que no controlo) deberían ejecutarse o no.

En la actualidad, las pruebas simplemente verifican la envvariable " $DISPLAY", y si está allí, intentarán conectarse, y cuando la conexión no funciona, las pruebas suponen un fallo de la prueba, no simplemente la pantalla no es conectable.

Solo necesito poder hacer

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

Para detener estas pruebas que tienen problemas mentales graves.

En una situación ideal, la herramienta requerida para hacer esto debe venir provista con las bibliotecas de X Client en sí, para no incurrir en dependencias especiales y poder asumir que si la utilidad no está allí, no podemos conectarnos a ninguna pantalla.

Kent Fredric
fuente

Respuestas:

6

Puedes probar con el comando xset:

if [[ ! $(xset -q) ]]; then
   # the X server is not reachable
else
   # the X server is reachable
fi
slubman
fuente
Aunque terminé usándolo de una manera más compleja, parece que xset está más instalado que xdpyinfo.
Kent Fredric el
2

Supongo que hay una mejor solución. Pero siempre puede usar una herramienta pequeña como xclock y verificar el estado de salida.

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

Pero hombre, eso es feo :-)

Menos Hacky, pon lo siguiente en checkX.c:

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

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

Entonces:

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

Finalmente:

if ./checkX; then
   echo "We are good to go!"
fi
Kyle Brandt
fuente
Sí, eso es lo primero que consideré, pero quería algo que no creara visualmente una ventana: /. Incluso consideré hacer xclock y luego matarlo.
Kent Fredric el
xclock -geometry 1x1 es lo mejor que puedo hacer para eliminar la intrusión visual: /, pero también asigna un espacio de tareas en la barra de tareas :(
Kent Fredric
Ese es el primer programa X que he escrito en C, así que no estoy seguro de si es completamente confiable :-)
Kyle Brandt
Y no es lo más portátil ;-)
Kyle Brandt
Eso es increíblemente útil, desafortunadamente, mis limitaciones son algo más estrictas. A decir verdad, estoy escribiendo un ebuild (gentoo), por lo que tengo que hacer virtualmente / everything / in shell, y asumir que las aplicaciones estarán allí de antemano y no puedo agregar blobs binarios con anticipación a aplicaciones de terceros :)
Kent Fredric el
1

Aquí hay un posible WayToDoIt, aunque no estoy seguro de lo bueno que es.

  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 
   ...

Esto parece estar funcionando.

Kent Fredric
fuente
En mi máquina Fedora 11 obtengo: $ xdpyinfo 1 uso: xdpyinfo [opciones] De todos modos, creo que parece una buena idea usar el programa xdpyinfo.
Cristian Ciupitu
el '1' hay redireccionamiento stderr para bash;), no un parámetro xdpyinfo :)
Kent Fredric