Como encontrar programaticamente o valor atual de DISPLAY quando o DISPLAY não está definido? (para uso em crontab)

6

Eu tenho um script que é executado via cron para alterar o papel de parede da área de trabalho. Eu posso fazê-lo funcionar exportando a variável DISPLAY.

Mas a questão que me preocupa é que o script funcione em todos os sistemas. Como encontrar o valor de DISPLAY definido pelo servidor X sem usar $ DISPLAY?

Então, como posso encontrar o valor correto para DISPLAY programaticamente. Eu posso fazê-lo funcionar somente quando DISPLAY=:1 . A configuração para ":0" faz o script sair com

No protocol specified
Cannot open display.
    
por Ashhar Hasan 11.03.2016 / 16:11

2 respostas

5

Você não pode com certeza. Você tem que fazer suposições.

Finja que você é cron e está enfrentando o pior cenário por um segundo: há vários usuários conectados e cada usuário está executando várias sessões X. Você terá que adivinhar o usuário (bastante fácil, estamos executando o crontab) e uma das sessões X desse usuário.

Se quisermos supor que o usuário está executando uma e somente uma sessão X de um tty e obter o valor $DISPLAY dessa sessão, podemos usar w :

USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
user     tty1                      16:32    7:15   0.21s  0.19s -zsh
user     tty2     :1               15:52   48:13   2:17   0.08s /sbin/upstart
user     pts/3    :1               16:19    0.00s  0.66s  0.00s w

Por exemplo, aqui estou logado em tty1, em tty2 (onde estou executando uma sessão X) e em pts / 3 (o terminal do qual estou executando o comando).

Com um pouco de análise:

% w $(id -un) | awk 'NF > 7 &&  ~ /tty[0-9]+/ {print ; exit}'
:1

Então, assumindo todos os itens acima:

0 0 * * * DISPLAY=$(w $(id -un) | awk 'NF > 7 &&  ~ /tty[0-9]+/ {print ; exit}') command

Fará cron executar command com $DISPLAY definido para a primeira sessão X em execução no valor $DISPLAY de tty encontrado para o usuário.

    
por kos 11.03.2016 / 17:12
1

Para uma discussão mais detalhada, consulte link

Vou simplesmente listar as informações relevantes dessa resposta aqui:

Parece haver duas maneiras simples de encontrar as instâncias do servidor X em execução no seu sistema.

  • w :
    O comando w lista todos os displays abertos. Você pode usar awk para filtrar as informações necessárias. Os valores abaixo de FROM são os valores correspondentes a DISPLAY .

    ashhar@xenon:[/tmp/.X11-unix]                                    
por Ashhar Hasan 11.03.2016 / 16:52

Tags