Configurando DISPLAY no arquivo de serviço systemd


9

Estou tentando aprender serviços systemd tentando iniciar o xclock como um serviço; o arquivo de serviço está abaixo

[Unit]
Description=clock

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

[Install]
WantedBy=graphical.target

Alguma idéia do que há de errado aqui? Estou recebendo um erro dizendo "não é possível conectar ao display".

Respostas:


18

Um aplicativo precisa de duas coisas para abrir uma janela em um monitor X. Ele precisa saber a localização da tela X; isso é transmitido pela DISPLAYvariável de ambiente. Ele também precisa se autenticar com o servidor X. Isso é transmitido por meio de um cookie, que é um valor secreto gerado pelo servidor X quando é iniciado e armazenado em um arquivo que somente o usuário que iniciou o servidor X pode acessar. O arquivo de cookie padrão é ~/.Xauthority.

Se o seu servidor X estiver usando o local padrão do arquivo de cookies, a adição Environment=XAUTHORITY=/home/dogs/.Xauthorityfuncionará (supondo que /home/dogsseja o diretório inicial do usuário que efetuou login no X). Se você precisar encontrar o local, consulte Posso iniciar um programa gráfico na área de trabalho de outro usuário como root? e Abra uma janela em um monitor X remoto (por que "Não é possível abrir o monitor")?

Como alternativa, a execução do programa como o usuário que está executando o servidor X funcionará, desde que o arquivo de cookies esteja no local padrão (caso contrário, você precisará localizar o arquivo de cookies, como no caso raiz). Adicione a Userdiretiva (por exemplo User=dogs).

Obviamente, o serviço não será executado se não houver uma exibição X desse número pertencente ao usuário que você especificar.

É um pouco estranho iniciar um programa de GUI no Systemd. Não foi projetado para isso. Os programas GUI vivem em uma sessão X, iniciada por um usuário. Systemd é para processos do sistema. Você deve experimentar os daemons.


1
Não é um problema usando systemctl --user. Além disso, a DISPLAYvariável não é uma questão então. Dê uma olhada aqui .
Suuuehgi 17/05/19

-2

Você pode adicionar .xinitrc:

xhost si:localuser:$USER

Funciona para mim!


1
isto é para arquivos de serviço Systemd, não .xinitrc
gíria
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.