xrandr como root não pode encontrar exibe

8

Eu tenho a seguinte regra chamada meu script quando eu encaixar ou desassociar meu ThinkPad:

# /lib/udev/rules.d/81-thinkpad-dock.rules
KERNEL=="dock.0", ATTR{docked}=="0", RUN+="/usr/bin/think-dock-hook off"
KERNEL=="dock.0", ATTR{docked}=="1", RUN+="/usr/bin/think-dock-hook on"

Esse é o script que será chamado:

# /usr/bin/think-dock-hook
# Find the user who is currently logged in on the primary screen.
user="$(who -u | grep -F '(:0)' | head -n 1 | awk '{print }')"
su -c "bash -x /usr/bin/think-dock $setto" "$user" >> /root/think-dock.log 2>&1 &

E o script que é chamado faz algo com xrandr .

O problema é que posso executar think-dock on como meu usuário ( mu ) e isso funciona. Eu posso sudo -i e executar think-dock-hook on e funciona também. Mas quando eu deixo udev executá-lo, é só pegar o seguinte erro de xrandr :

# output of bash -x think-dock on
+ xrandr --output LVDS1 --auto
Can't open display

Agora, se eu chamar xrandr do meu sudo -i shell, obtenho:

No protocol specified
No protocol specified
Can't open display :0

No entanto, se eu fizer su -c xrandr mu do meu sudo -i shell, obtenho a saída esperada.

Então, eu realmente não entendo, o script chamado de udev falha.

    
por Martin Ueding 15.08.2012 / 23:55

1 resposta

6
  • xrandr precisa saber de qual tela você está falando, normalmente por meio da variável de ambiente DISPLAY
  • root (que udev é executado como) não tem nenhum padrão DISPLAY set; mesmo que tenha, su -c não preserva o ambiente por padrão
  • Então passe explicitamente para bash, e isso deve resolver seu problema, por exemplo:

    su -c "DISPLAY=:0.0 bash -x /usr/bin/think-dock $setto" "$user"
    
por ish 30.08.2012 / 14:59

Tags