Wie teste ich programmgesteuert, ob es möglich ist, eine Verbindung zu dem in $ DISPLAY angegebenen X-Server herzustellen?

8

Dies ist ein Mittelweg zwischen Programmierung und Server-Admin, aber dies scheint letztendlich der relevanteste Ort dafür zu sein.

Ich suche nach einer Möglichkeit, um festzustellen, ob die Variable ' $DISPLAY' einen XServer bewirbt, mit dem wir tatsächlich eine Verbindung herstellen können, dh ob die gesamte Authentifizierung und so weiter vorhanden ist, damit weitere Dinge ausgeführt werden können.

Ich suche idealerweise nach einem Shell-End-Tool, das true / false zurückgibt und das in einem Build-Skript verwendet werden kann, um zu bestimmen, ob die anderen darin enthaltenen Tests (die ich nicht kontrolliere) ausgeführt werden sollen oder nicht.

Die Tests prüfen derzeit einfach, ob die envVariable " $DISPLAY" vorhanden ist. Wenn sie vorhanden ist, wird versucht, eine Verbindung herzustellen. Wenn die Verbindung nicht funktioniert, gehen die Tests davon aus, dass der Test fehlgeschlagen ist und nicht einfach die Anzeige nicht verbunden werden kann.

Ich muss es nur können

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

Um diese Tests mit schweren psychischen Problemen zu stoppen.

Im Idealfall sollte das dafür erforderliche Tool mit den X-Client-Bibliotheken selbst geliefert werden, um keine besonderen Abhängigkeiten zu verursachen und davon ausgehen zu können, dass wir keine Verbindung zu einem Display herstellen können, wenn das Dienstprogramm nicht vorhanden ist.

Kent Fredric
quelle

Antworten:

6

Sie können es mit dem Befehl xset versuchen:

if [[ ! $(xset -q) ]]; then
   # the X server is not reachable
else
   # the X server is reachable
fi
Slubman
quelle
Obwohl ich es letztendlich komplexer verwendet habe, scheint xset eher installiert zu sein als xdpyinfo.
Kent Fredric
2

Ich vermute, es gibt eine bessere Lösung. Sie können jedoch immer nur ein kleines Tool wie xclock verwenden und den Exit-Status überprüfen.

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

Aber Mann, das ist hässlich :-)

Weniger Hacky, füge folgendes in checkX.c ein:

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

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

Dann:

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

Zuletzt:

if ./checkX; then
   echo "We are good to go!"
fi
Kyle Brandt
quelle
Ja, das ist das erste, worüber ich nachgedacht habe, aber ich wollte etwas, das kein visuelles Fenster erstellt: /. Ich habe sogar darüber nachgedacht, xclock & zu machen und es dann zu töten.
Kent Fredric
xclock -geometry 1x1 ist ungefähr das Beste, was ich tun kann, um visuelle Eingriffe zu vermeiden: /, aber es weist auch einen Aufgabenbereich in der Taskleiste zu :(
Kent Fredric
Das ist das erste X-Programm, das ich jemals in C geschrieben habe, also nicht sicher, ob es
Kyle Brandt
Und nicht die tragbarste Sache ;-)
Kyle Brandt
Das ist ziemlich praktisch, nur leider sind meine Einschränkungen etwas strenger. Um ehrlich zu sein, ich schreibe ein Ebuild (Gentoo), also muss ich praktisch / alles / in der Shell tun und davon ausgehen, dass Apps vorab verfügbar sind und ich kann nicht einfach binäre Blobs vorzeitig zu Apps von Drittanbietern hinzufügen :)
Kent Fredric
1

Hier ist ein möglicher Weg, aber nicht sicher, wie gut es ist.

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

Dies scheint zu funktionieren.

Kent Fredric
quelle
Auf meinem Fedora 11-Computer wird Folgendes angezeigt: $ xdpyinfo 1 Verwendung: xdpyinfo [Optionen] Ich denke, es klingt nach einer guten Idee, das Programm xdpyinfo zu verwenden.
Cristian Ciupitu
die '1' gibt es stderr redirect für bash;), kein xdpyinfo param :)
Kent Fredric