Configuración de DISPLAY en el archivo de servicio systemd

9

Estoy tratando de aprender los servicios de systemd intentando iniciar xclock como un servicio; el archivo de servicio está debajo

[Unit]
Description=clock

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

[Install]
WantedBy=graphical.target

Alguna idea de lo que está mal aquí? Recibo un error que dice "no se puede conectar a la pantalla".

perros
fuente

Respuestas:

18

Una aplicación necesita dos cosas para abrir una ventana en una pantalla X. Necesita saber la ubicación de la pantalla X; eso es transmitido por la DISPLAYvariable de entorno. También necesita autenticarse con el servidor X. Esto se transmite a través de una cookie, que es un valor secreto generado por el servidor X cuando se inicia y almacena en un archivo al que solo puede acceder el usuario que inició el servidor X. El archivo de cookie predeterminado es ~/.Xauthority.

Si su servidor X está utilizando la ubicación predeterminada del archivo de cookies, la adición Environment=XAUTHORITY=/home/dogs/.Xauthorityfuncionará (suponiendo que /home/dogssea ​​el directorio de inicio del usuario que inició sesión en X). Si necesita encontrar la ubicación, consulte ¿Puedo iniciar un programa gráfico en el escritorio de otro usuario como root? y Abrir una ventana en una pantalla X remota (¿por qué "No se puede abrir la pantalla")?

Alternativamente, ejecutar el programa como el usuario que está ejecutando el servidor X funcionará, siempre que el archivo de cookies se encuentre en la ubicación predeterminada (de lo contrario, tendrá que ubicar el archivo de cookies, como en el caso raíz). Agregue la Userdirectiva (por ejemplo User=dogs).

Por supuesto, el servicio no se ejecutará si no hay una pantalla X con ese número propiedad del usuario que especifique.

Es bastante extraño iniciar un programa GUI desde Systemd. No fue diseñado para esto. Los programas GUI viven en una sesión X, iniciada por un usuario. Systemd es para procesos del sistema. Deberías experimentar con demonios en su lugar.

Gilles 'SO- deja de ser malvado'
fuente
1
No es un problema usarlo systemctl --user. Además, la DISPLAYvariable no es una cuestión entonces. Echa un vistazo aquí .
Suuuehgi
-2

Puedes agregar .xinitrc:

xhost si:localuser:$USER

¡Esto funciona para mi!

Monica
fuente
1
esto es para archivos de servicio systemd, no .xinitrc
argot