Como faço para testar programaticamente se é possível conectar-se ao servidor X especificado em $ DISPLAY?

8

Este é um meio-termo intermediário entre programação e administração de servidor, mas este parece ser o lugar mais relevante para isso.

Estou procurando uma maneira de determinar se a variável ' $DISPLAY ' está anunciando um XServer ao qual podemos nos conectar, ou seja, se toda a autenticação e outros detalhes estiverem em vigor para permitir que mais coisas sejam executadas.

Eu estou idealmente procurando por algo como ferramenta shell-end que retorne verdadeiro / falso, que pode ser usado em um script de compilação para determinar se os outros testes nele (que eu não controle) devem ser executados ou não .

Os testes no momento simplesmente verificam a variável env " $DISPLAY " e, se estiver lá, tentarão se conectar e, quando a conexão não funcionar, os testes assumem a falha do teste, não simplesmente a tela não é conectável.

Eu só preciso ser capaz de fazer

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

Para parar estes testes com problemas mentais graves.

Em uma situação ideal, a ferramenta necessária para isso deve ser fornecida com as próprias bibliotecas X Client, de modo a não incorrer em dependências especiais, e ser capaz de assumir se o utilitário não estiver lá, não podemos nos conectar qualquer exibição.

    
por Kent Fredric 26.08.2009 / 21:15

3 respostas

6

Você pode tentar com o comando xset:

if [[ ! $(xset -q) ]]; then
   # the X server is not reachable
else
   # the X server is reachable
fi
    
por 26.08.2009 / 21:38
2

Eu estou supondo que há uma solução melhor. Mas você sempre pode usar apenas uma pequena ferramenta como xclock e verificar o status de saída.

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

Mas cara, isso é feio: -)

Menos Hacky, coloque o seguinte no checkX.c:

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

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

Então:

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

Por fim:

if ./checkX; then
   echo "We are good to go!"
fi
    
por 26.08.2009 / 21:24
1

Heres um WayToDoIt possível, não tenho certeza como é bom embora.

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

Este aparece para funcionar.

    
por 26.08.2009 / 21:38