Définition de DISPLAY dans le fichier de service systemd

9

J'essaie d'apprendre les services systemd en essayant de démarrer xclock en tant que service; le fichier de service est ci-dessous

[Unit]
Description=clock

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

[Install]
WantedBy=graphical.target

Des idées ce qui ne va pas ici? Je reçois une erreur indiquant "impossible de se connecter à l'affichage".

chiens
la source

Réponses:

18

Une application a besoin de deux choses pour ouvrir une fenêtre sur un écran X. Il doit connaître l'emplacement de l'affichage X; qui est véhiculé par la DISPLAYvariable d'environnement. Il doit également s'authentifier auprès du serveur X. Ceci est transmis via un cookie, qui est une valeur secrète générée par le serveur X lors de son démarrage et stockée dans un fichier auquel seul l'utilisateur qui a démarré le serveur X peut accéder. Le fichier cookie par défaut est ~/.Xauthority.

Si votre serveur X utilise l'emplacement du fichier cookie par défaut, l'ajout Environment=XAUTHORITY=/home/dogs/.Xauthorityfonctionnera (en supposant qu'il /home/dogss'agit du répertoire personnel de l'utilisateur connecté sous X). Si vous devez trouver l'emplacement, voir Puis-je lancer un programme graphique sur le bureau d'un autre utilisateur en tant que root? et ouvrir une fenêtre sur un écran X distant (pourquoi «Impossible d'ouvrir l'écran»)?

Alternativement, l'exécution du programme en tant qu'utilisateur qui exécute le serveur X fonctionnera, à condition que le fichier cookie se trouve à l'emplacement par défaut (sinon, vous devrez localiser le fichier cookie, comme dans le cas racine). Ajoutez la Userdirective (par exemple User=dogs).

Bien sûr, le service ne fonctionnera pas s'il n'y a pas d'affichage X avec ce numéro appartenant à l'utilisateur que vous spécifiez.

C'est assez bizarre de démarrer un programme GUI à partir de Systemd. Il n'a pas été conçu pour cela. Les programmes GUI vivent dans une session X, démarrée par un utilisateur. Systemd est destiné aux processus système. Vous devriez plutôt essayer des démons.

Gilles 'SO- arrête d'être méchant'
la source
1
Ce n'est pas un problème d'utilisation systemctl --user. La DISPLAYvariable n'est pas non plus une question alors. Jetez un oeil ici .
Suuuehgi
-2

Vous pouvez ajouter .xinitrc:

xhost si:localuser:$USER

Ça marche pour moi!

Monica
la source
1
c'est pour les fichiers de service systemd, pas .xinitrc
argot