Eu desenvolvo um programa que uso xrandr
para obter informações sobre a resolução atual da tela e taxas de atualização. O programa deve ser executado como um serviço do sistema.
Escrevi um serviço simples para testar como xrandr
funcionaria desta forma:
[Unit]
Description=xrandrsystemd
[Service]
ExecStart=xrandr
[Install]
WantedBy=multi-user.target
e quando eu inicio, xrandr
falhou com message Can't open display
. Eu acho que é porque os serviços do sistema iniciam antes do servidor X, então xrandr
não é possível acessá-lo para obter informações sem DISPLAY
variáveis XAUTHORITY
de ambiente definidas após algum usuário efetuar login na sessão gráfica.
Se eu codifiquei essas variáveis para .service
arquivar, xrandr
funciona corretamente.
Environment="DISPLAY=:0"
Environment="XAUTHORITY=/home/<logged_user>/.Xauthority"
O problema é que a solução serve apenas para <logged_user>
esta máquina, mas preciso de uma solução mais comum. Tentei adicionar algo como XAUTHORITY=$(su - $USER -c "echo $HOME/.Xauthority")
at .service
file ou substituir xrandr
a chamada ExecStart
para shell script como DISPLAY=...; XAUTHORITY=...; xrandr
, mas não funcionou.
Existem idéias sobre como obter informações do servidor X dos serviços de sessão do sistema?
Encontrei uma solução possível - você pode usar um arquivo XAuthority gerado pelo gerenciador de desktop do seu sistema operacional. Por exemplo, seria
/var/run/lightdm/root/:0
para LightDM e.service
o arquivo seria assim:Outros DMs são descritos aqui .
Você pode encontrar esses arquivos de autenticação na saída de
ps a | grep auth
.Você não precisa do X11 para determinar os modos atuais nas telas conectadas; você pode usar
drm_info
(nodrm-info
pacote no Debian e derivados,drm_info
no Fedora e derivados):Para fins de script, seria melhor analisar a saída JSON do comando (
drm_info -j
) — procure CRTCs com informações de modo, por exemploSe quiser listar todos os modos suportados, você pode decodificar os EDIDs encontrados pelo próprio kernel:
edid-decode
é comumente empacotado em distribuições ( por exemplo, como oedid-decode
pacote no Debian e derivados, e no Fedora e derivados).