Configuração de DISPLAY no arquivo de serviço systemd

7

Estou tentando aprender os serviços do 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 está errado aqui? Estou recebendo um erro dizendo "não é possível se conectar para exibição".

    
por dogs 01.08.2013 / 23:57

2 respostas

14

Um aplicativo precisa de duas coisas para abrir uma janela em um display X. Precisa saber a localização do display X; isso é transmitido pela variável de ambiente DISPLAY . Também precisa 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 do arquivo de cookie padrão, a adição de Environment=XAUTHORITY=/home/dogs/.Xauthority funcionará (supondo que /home/dogs seja 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 display X remoto (por que" Não é possível abrir a tela ")?

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

É claro que o serviço não será executado se não houver um display X com o número de propriedade do usuário que você especificar.

É bastante bizarro iniciar um programa GUI a partir do Systemd. Não foi projetado para isso. Programas GUI vivem em uma sessão X, iniciada por um usuário. O Systemd é para processos do sistema. Você deveria experimentar com daemons.

    
por 02.08.2013 / 02:24
-2

Você pode adicionar .xinitrc :

xhost si:localuser:$USER

Funciona para mim!

    
por 17.07.2015 / 12:40