Festlegen von DISPLAY in der systemd-Servicedatei

8

Ich versuche, systemd-Dienste zu lernen, indem ich versuche, xclock als Dienst zu starten. Die Servicedatei ist unten

[Unit]
Description=clock

[Service]
Environment=DISPLAY=:0
ExecStart=/usr/bin/xclock

[Install]
WantedBy=graphical.target

Irgendwelche Ideen, was hier falsch ist? Ich erhalte die Fehlermeldung "Verbindung zur Anzeige nicht möglich".

Hunde
quelle

Antworten:

17

Eine Anwendung benötigt zwei Dinge, um ein Fenster auf einer X-Anzeige zu öffnen. Es muss die Position der X-Anzeige kennen. Das wird durch die DISPLAYUmgebungsvariable vermittelt . Es muss sich auch beim X-Server authentifizieren. Dies wird durch ein Cookie übertragen, bei dem es sich um einen geheimen Wert handelt, der vom X-Server beim Start generiert und in einer Datei gespeichert wird, auf die nur der Benutzer zugreifen kann, der den X-Server gestartet hat. Die Standard-Cookie-Datei ist ~/.Xauthority.

Wenn Ihr X-Server den Standardspeicherort für Cookie-Dateien verwendet, Environment=XAUTHORITY=/home/dogs/.Xauthorityfunktioniert das Hinzufügen (vorausgesetzt, es /home/dogshandelt sich um das Ausgangsverzeichnis des Benutzers, der unter X angemeldet ist). Wenn Sie den Speicherort suchen müssen, lesen Sie Kann ich ein Grafikprogramm auf dem Desktop eines anderen Benutzers als Root starten? und Öffnen Sie ein Fenster auf einer Remote-X-Anzeige (warum kann die Anzeige nicht geöffnet werden)?

Alternativ funktioniert das Ausführen des Programms als Benutzer, der den X-Server ausführt, vorausgesetzt, die Cookie-Datei befindet sich am Standardspeicherort (andernfalls müssen Sie die Cookie-Datei wie im Root-Fall suchen). Fügen Sie die UserDirektive hinzu (z User=dogs. B. ).

Natürlich wird der Dienst nicht ausgeführt, wenn für diese Nummer des von Ihnen angegebenen Benutzers keine X-Anzeige vorhanden ist.

Es ist ziemlich bizarr, ein GUI-Programm von Systemd aus zu starten. Es war nicht dafür ausgelegt. GUI-Programme befinden sich in einer X-Sitzung, die von einem Benutzer gestartet wurde. Systemd ist für Systemprozesse. Sie sollten stattdessen mit Dämonen experimentieren.

Gilles 'SO - hör auf böse zu sein'
quelle
1
Es ist kein Problem mit systemctl --user. Auch die DISPLAYVariable spielt dann keine Rolle. Schauen Sie hier .
Suuuehgi
-2

Sie können hinzufügen .xinitrc:

xhost si:localuser:$USER

Für mich geht das!

Monica
quelle
1
Dies ist für Systemd Service-Dateien, nicht .xinitrc
Slang