Wie überprüfe ich, ob der X-Server ausgeführt wird?

73

Gibt es eine Möglichkeit herauszufinden, ob der aktuelle Sitzungsbenutzer einen Xserver (unter Linux) ausführt?

Ich habe mit Dingen angefangen wie:

ps -e | grep X 

das funktioniert aber nicht immer

und eine weitere Sache, die ich versucht habe, ist die Überprüfung der $DISPLAYVariablen

Gibt es andere Möglichkeiten, dies zu überprüfen?

BEARBEITEN: Einige Leute schlugen vor, die $ DISPLAY-Variablen zu verwenden, aber was ist, wenn der Benutzer mit dieser Variablen spielt? Was ist, wenn er versucht, etwas zu tun und diese Variable ändert? Wenn ich sie dann überprüfe, spiegelt sie nicht mehr den genauen Zustand des Systems wider. Gibt es dafür keinen bestimmten Weg, der immer eine korrekte Antwort zurückgibt?

Ich fand, dass es programmatisch so gemacht werden kann:

#include <X11/Xlib.h> 
int main()
    { exit(XOpenDisplay(NULL) ? 0 : 1);  } 

$ gcc -o xprobe xprobe.c -L/usr/X11R6/lib -lX11 

Aber ich suche einen Drehbuchweg.

RomanM
quelle
2
warum funktioniert "ps -e | grep X" nicht immer?
stephendl
2
Und warum funktioniert $ DISPLAY nicht?
Matthew Marshall
@stephendl: Ich habe festgestellt, dass in einigen Situationen X ausgeführt wird, der Benutzer jedoch über ein Terminal ohne X verbunden ist. @matthew: Was passiert, wenn der Benutzer mit dieser Variablen spielt und sie nicht mehr den tatsächlichen Status des Systems widerspiegelt?
RomanM
Nur eine Kleinigkeit: Es macht keinen Sinn, exit () in Ihrem C-Programm aufzurufen, um auf X zu testen. Geben Sie einfach den Status zurück und Sie sind fertig.
Entspannen Sie am
5
Und um ein bisschen mehr zu picken ... das XOpenDisplay verwendet die Umgebungsvariable DISPLAY intern.
Petesh

Antworten:

64

Ich muss häufig einen X-Befehl auf einem Server ausführen, auf dem viele X-Server ausgeführt werden, sodass die psbasierten Antworten nicht funktionieren. Muss natürlich $DISPLAYentsprechend eingestellt werden. Um zu überprüfen, ob dies gültig ist, verwenden Sie xset qin einem Fragment wie:

if ! xset q &>/dev/null; then
    echo "No X server at \$DISPLAY [$DISPLAY]" >&2
    exit 1
fi
Bobbogo
quelle
Ich denke, das ist "besser" als zu verwenden xpropund produziert xdpyinfoda xsetweniger Output /dev/nullzum Essen. Das OP sollte diese Antwort akzeptieren.
Jamadagni
Wenn an der Adresse $ DISPLAY überhaupt kein X-Server ausgeführt wird, xsethängt er nur in der Tat an allen X-Befehlen. Gibt es eine Möglichkeit, eine Auszeit festzulegen?
wird
1
@will Dieser Hang ist nicht spezifisch für xset. Jedes X-Programm wird darunter leiden. Der Hang hängt vom X-Transport ab. Wenn Sie DISPLAY=:1gesagt haben, impliziert dies TCP-Port 6001. Möglicherweise wird ein Rouge-Prozess abgehört. Ich xsetkehre sofort zurück, wenn nichts zuhört.
Bobbogo
Das ist gut, aber warum ist es laut? Ich erhalte immer wieder "connect /tmp/.X11-unix/X1: Keine solche Datei oder kein solches Verzeichnis", selbst wenn ich stdout und stderr nach / dev / null umleitung. Ich habe es geschafft, und es scheint nicht von xset geschrieben zu werden. Ich habe auch das relevante sshd bearbeitet und es scheint es auch nicht zu schreiben. xset, xdpyinfo und das Testprogramm in der ursprünglichen Frage geben alle diese nutzlose Fehlermeldung aus.
Dstromberg
@dstromberg Dies ist ein ziemlich unangemessener Ort für diese Frage! Dennoch: Es scheint mir , wie Sie ssh-ing von einem lokalen Rechner sind lokal in einen Remote - Computer Remote , mit X-Weiterleitung in Ihrem eingeschaltet ssh . Das Problem ist, dass der ursprüngliche Befehl ssh Zugriff auf einen funktionierenden X-Server benötigt, und es scheint mir, dass Sie $DISPLAYauf lokal schlecht eingestellt sind . Was dann passiert, ist, dass Sie einen X-Befehl auf der Fernbedienung ausführen . Ssh tunnelt das X-Protokoll zurück zu local, was (aufgrund der zweifelhaften $DISPLAY) fehlschlägt, und ssh druckt die Nachricht.
Bobbogo
19

$ DISPLAY ist der Standardweg. Auf diese Weise kommunizieren Benutzer mit Programmen darüber, welcher X-Server gegebenenfalls verwendet werden soll.

Ken
quelle
aber was ist, wenn der Benutzer mit dieser Variablen spielt? Was ist, wenn er versucht, etwas zu tun und diese Variable ändert? Wenn ich sie dann überprüfe, spiegelt sie nicht mehr den genauen Zustand des Systems wider. Gibt es dafür keinen konkreten Weg?
RomanM
4
Wenn ich $ DISPLAY einstelle, möchte ich, dass Ihr Programm auf eine andere Anzeige wechselt. Was genau ist Ihr Anwendungsfall, in dem Sie die explizite Konfiguration des Benutzers hinterfragen möchten? Vermeiden Sie die Verwendung von $ HOME, falls der Benutzer auch damit "herumfummelt"? Wo endet es?
Ken
2
Auf welchen X-Server möchten Sie genau zugreifen? Ich musste oft Treiber auf Remote-Systemen installieren. In POSIX ist XOpenDisplay (NULL) so definiert, dass einfach $ DISPLAY gelesen wird. Es klingt also bestenfalls so, als würden Sie auf nicht standardmäßiges Verhalten zählen.
Ken
5
Ich meine, wenn auf localhost einer läuft, aber $ DISPLAY auf einen anderen Server gesetzt wird, weil sie remote angemeldet sind, möchten Sie trotzdem den "lokalen"? Was ist, wenn es mehr als eine lokale gibt? Ich weiß nicht, wie Sie das erkennen würden oder warum Sie es wollen würden. $ DISPLAY existiert aus einem bestimmten Grund.
Ken
1
Könnten Sie Ihre Antwort für Benutzer aus der Linux-Welt ausarbeiten? Was ist $ DISPLAY? Wie benutzt man es?
Paul
9

ich benutze

pidof X && echo "yup X server is running"

pgrep und $ DISPLAY sind weitere Optionen.

Weitere Überlegungen:

su dann wird $ DISPLAY nicht gesetzt. Dinge, die die Umgebung des laufenden Programms verändern, können dazu führen, dass dies nicht funktioniert.

Ich empfehle ps -e | nicht grep X findet hier procX, das nicht der X-Server ist.

Ian Kelling
quelle
Ist das nicht dasselbe wie ps -e |? grep X? AFAIK pidof nur ein Alias ​​für killall5 und ist nicht immer auf allen Systemen definiert
RomanM
Von man pidof: "pidof ist eigentlich das gleiche Programm wie killall5; das Programm verhält sich entsprechend dem Namen, unter dem es aufgerufen wird." pidof verhält sich anders als killall5. Wenn Sie ein altes altes Unix-System verwenden, ist es möglicherweise nicht vorhanden.
Ian Kelling
Das Gleiche gilt für alte Unix-Systeme in Bezug auf etwa eine Million Dinge.
Ian Kelling
8

Ein Trick, mit dem ich feststellen kann, ob X ausgeführt wird, ist:

Telnet 127.0.0.1 6000

Wenn eine Verbindung hergestellt wird, wird ein X-Server ausgeführt, der eingehende TCP-Verbindungen akzeptiert (heutzutage normalerweise nicht die Standardeinstellung).

Dicroce
quelle
1
Ich denke, derzeit würden sicherheitsbewusste Systeme den telnetBefehl nicht zur Verfügung haben.
Boardrider
1
Sicherheitsbewusste Systeme lauschen auch nicht auf einem TCP-Port, sondern sind auf Unix-Domain-Sockets beschränkt, wodurch diese Methode weiter ungültig wird.
Alanc
8

Sie können verwenden xdpyinfo(kann über installiert werden apt-get install x11-utils).

shuckc
quelle
6
xprop -root &> /dev/null 

... ist mein bewährter Befehl, um auf eine "X-fähige" Situation zu testen. Und es ist so gut wie garantiert, dass es sich auf jedem System befindet, auf dem X ausgeführt wird. Natürlich schlägt der Befehl fehl, wenn er nicht gefunden wird. Selbst wenn er nicht vorhanden ist, können Sie so ziemlich davon ausgehen, dass es auch kein X gibt. (Deshalb benutze ich &> anstelle von>)

Osirisgothra
quelle
1
Re &>für die Verwendung in Shell-Skripten, unter dashdenen nicht unterstützt wird &>, kann man verwenden >/dev/null 2>&1.
Jamadagni
1
Auf Cygwin eine typische Art und Weise X zu installieren , ist das Paket installieren xinit. Wird xpropalso nicht automatisch installiert, da es sich nicht um eine Abhängigkeit handelt.
Egor Skriptunoff
4

1)

# netstat -lp | grep -ix
tcp 0 0 *: x11 *: * HÖREN 2937 / X.          
tcp6 0 0 [::]: x11 [::]: * LISTEN 2937 / X.          
Aktive UNIX-Domänensockets (nur Server)
Unix 2 [ACC] STREAM LISTENING 8940 2937 / X @ / tmp / .X11-unix / X0
Unix 2 [ACC] STREAM LISTENING 8941 2937 / X /tmp/.X11-unix/X0
#

2) nmap

# nmap localhost | grep -ix
6000 / TCP öffnen X11
#
vitaly.v.ch
quelle
3

Ich habe ein xdpyprobe- Programm geschrieben, das für diesen Zweck vorgesehen ist. Im Gegensatz zu xset, xdpyinfo und anderen allgemeinen Tools führt es keine zusätzlichen Aktionen aus (überprüft nur den X-Server und beendet ihn) und erzeugt möglicherweise keine Ausgabe (wenn die Option "-q" angegeben ist).

Alex Kost
quelle
3

Die Bash-Skript-Lösung:

if ! xset q &>/dev/null; then
    echo "No X server at \$DISPLAY [$DISPLAY]" >&2
    exit 1
fi

Funktioniert nicht, wenn Sie sich von einer anderen Konsole (Strg + Alt + F?) Oder ssh anmelden. Für mich funktioniert diese Lösung in meinem Archlinux:

#!/bin/sh
ps aux|grep -v grep|grep "/usr/lib/Xorg"
EXITSTATUS=$?
if [ $EXITSTATUS -eq 0 ]; then
  echo "X server running"
  exit 1
fi

Sie können / usr / lib / Xorg nur für Xorg oder den richtigen Befehl auf Ihrem System ändern.

oml
quelle
in meinem Fall war der Prozessname /usr/lib/xorg/Xorganstelle von/usr/lib/Xorg
ignacio
2

Zunächst müssen Sie sicherstellen, dass grundlegende X11-Pakete korrekt auf Ihrem Server installiert sind:

rpm -qa | grep xorg-x11-xauth

Wenn nicht, installieren Sie bitte alle Pakete:

sudo yum install xorg-x11-xauth xterm

Stellen Sie sicher, dass der openssh-Server für die Weiterleitung von x11-Verbindungen konfiguriert ist:

edit file : vim /etc/ssh/sshd_config

X11Forwarding yes

ANMERKUNG: Wenn vor dieser Zeile ein Kommentar (#) steht oder auf Nein gesetzt ist, aktualisieren Sie die Datei entsprechend den obigen Angaben und starten Sie Ihren SSH-Server-Daemon neu (seien Sie hier vorsichtig - wenn Sie einen Fehler gemacht haben, können Sie sich aus dem Code aussperren Server)

sudo /etc/init.d/sshd restart

Konfigurieren Sie nun die SSH-Anwendung so, dass X11-Anforderungen weitergeleitet werden:

ssh -Y your_username@your_server.your_domain.com
Srijan Chaudhary
quelle
2
if [[ $DISPLAY ]]; then 
  …
fi
Serge Stroobandt
quelle
0

Dies ist ein PHP-Skript zur Überprüfung.

$xsession = `pidof X`;
if (!$xsession) {
    echo "There is no active X session, aborting..\n";
    exit;
}

Ein ähnlicher Befehl kann auch im Shell-Skript verwendet werden. wie der Befehl pidof.

user3607430
quelle