xrandr comando não executado dentro do comando shell chamado da regra do udev

5

Eu possuo um Thinkpad com um UltraBase (uma estação de encaixe). Meu sistema operacional é o Ubuntu 10.10. Agora, gostaria de reagir ao evento "docking" definindo a resolução do meu monitor externo corretamente. Aqui está o que eu já fiz:

$ udevadm info -a -p /sys/devices/platform/dock.0

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

looking at device '/devices/platform/dock.0':
  KERNEL=="dock.0"
  SUBSYSTEM=="platform"
  DRIVER==""
  ATTR{modalias}=="platform:dock"
  ATTR{docked}=="0"
  ATTR{flags}=="16"
  ATTR{uid}=="0"
  ATTR{type}=="dock_station"

looking at parent device '/devices/platform':
  KERNELS=="platform"
  SUBSYSTEMS==""
  DRIVERS==""

Em seguida, criei uma regra do udev:

$ cat /etc/udev/rules.d/99-docking.rules
KERNEL=="dock.0", ATTR{docked}=="1", RUN+="/usr/local/sbin/dock.sh"

O script /usr/local/sbin/dock.sh é o seguinte:

#!/bin/sh
# turn external display on, internal off
echo "hello world" >> "/home/hoppe/udev.out"
/usr/bin/xrandr --output LVDS1 --off
/usr/bin/xrandr --output DP2 --mode "1920x1080"
echo "hello world" >> "/home/hoppe/udev.out"
exit

Ambos os comandos de eco são executados sem problemas. Além disso, ao chamar o script manualmente, a resolução é definida corretamente. O que eu fiz de errado?

    
por labrassbandito 12.06.2011 / 14:07

1 resposta

6

xrandr é executado, mas falha. Você deveria ler suas mensagens de erro, elas diriam o que está errado. Você poderia colocar toda a saída do seu script no arquivo de log, adicionando essa linha logo após a linha #! :

exec >/home/hoppe/udev.out 2>&1

Você verá que a mensagem é:

Can't open display 

Como qualquer outro programa X, xrandr fala com o servidor X indicado pela variável de ambiente DISPLAY . Você precisa dizer para qual monitor falar. A qualquer momento, você pode ter vários servidores X em execução, alguns falando com hardware, alguns exibindo remotamente (por exemplo, VNC ), alguns não tendo qualquer exibição visível (por exemplo, xvfb ), etc. Encontrar quais displays X estão conectados a uma peça específica de hardware não é fácil, mas na prática, apenas assuma que :0 está conectado ao hardware e todos os outros não estão. Então coloque isso no seu script:

export DISPLAY=:0

Depois de ter resolvido o problema de DISPLAY , você precisará autorizar esse script a acessar sua exibição. Isso não é automático, mesmo que o script esteja sendo executado como root, porque o X é transparente para a rede: a raiz local só deve ter permissão para acessar exibições locais, e não há nenhum mecanismo especial para isso, o usual cookie também se aplica à raiz. Isso é coberto em Posso lançar um programa gráfico na área de trabalho de outro usuário como root? .

    
por 12.06.2011 / 14:25