Come testare a livello di codice se è possibile connettersi al server X specificato in $ DISPLAY


8

Questo è un po 'una via di mezzo tra programmazione e server-admin, ma alla fine sembra il posto più rilevante per esso.

Sto cercando un modo per determinare se la variabile ' $DISPLAY' sta pubblicizzando un XServer a cui possiamo effettivamente connetterci, cioè se tutta l'autenticazione e quant'altro è in atto per consentire l'esecuzione di altre cose.

Sono idealmente alla ricerca di qualcosa strumento shell-end che ritorni vero / falso, che può essere utilizzato in uno script di build per determinare se gli altri test in esso (che non controllo) dovrebbero essere eseguiti o meno.

I test attualmente controllano semplicemente la envvariabile " $DISPLAY" e, se è presente, proveranno a connettersi e quando la connessione non funziona, i test presuppongono il fallimento del test, non semplicemente il display non è collegabile.

Devo solo essere in grado di fare

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

Al fine di fermare questi test con gravi problemi mentali.

In una situazione ideale, lo strumento necessario per farlo dovrebbe venire fornito con le librerie X Client stesse, in modo da non incorrere in dipendenze speciali e per poter assumere se l'utilità non è presente non possiamo collegarci a nessun display.

Risposte:



2

Immagino che ci sia una soluzione migliore. Ma puoi sempre usare solo un piccolo strumento come xclock e controllare lo stato di uscita.

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

Ma amico, è brutto :-)

Meno Hacky, inserisci quanto segue in checkX.c:

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

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

Poi:

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

Infine:

if ./checkX; then
   echo "We are good to go!"
fi

Sì, questa è la prima cosa che ho considerato, ma volevo qualcosa che non creasse visivamente una finestra: /. Ho anche pensato di fare xclock e poi ucciderlo.
Kent Fredric,

xclock -geometry 1x1 è il massimo che posso fare per eliminare l'intrusione visiva: /, ma alloca anche uno spazio-task sulla barra delle attività :(
Kent Fredric,

Questo è il primo programma X che abbia mai scritto in C, quindi non sono sicuro che sia del tutto affidabile :-)
Kyle Brandt,

E non la cosa più portatile ;-)
Kyle Brandt il

È abbastanza utile, purtroppo, i miei vincoli sono un po 'più severi. A dire la verità, sto scrivendo un ebuild (gentoo), quindi devo praticamente fare / tutto / in shell, e presumere che le app saranno lì prima e non posso semplicemente aggiungere BLOB binari in anticipo alle app di terze parti :)
Kent Fredric,

1

Ecco un possibile WayToDoIt, non sono sicuro di quanto sia buono.

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

Questo sembra funzionare.


Sulla mia macchina Fedora 11 sto ottenendo: $ xdpyinfo 1 utilizzo: xdpyinfo [opzioni] Comunque, penso che sia una buona idea usare il programma xdpyinfo.
Cristian Ciupitu,

il '1' c'è reindirizzamento stderr per bash;), non un parametro xdpyinfo :)
Kent Fredric,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.