xrandr como root não consegue encontrar visores

9

Eu tenho a seguinte regra chamar meu script quando encaixe ou descaço do 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 $1}')"
su -c "bash -x /usr/bin/think-dock $setto" "$user" >> /root/think-dock.log 2>&1 &

E o script que é chamado então faz algo com xrandr.

O problema é que eu posso executar think-dock oncomo meu usuário ( mu) e funciona. Eu posso sudo -icorrer think-dock-hook one funciona também. Mas quando deixei udevexecutá-lo, obtive o seguinte erro de xrandr:

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

Agora, se eu ligar xrandrdo meu sudo -ishell, recebo:

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

No entanto, se eu faço su -c xrandr mudo meu sudo -ishell, fico com a saída esperada.

Então, eu realmente não entendo, o script chamado from udevfalha.

Martin Ueding
fonte
1
grep -F '(:0)'deveria ser grep -F '(:0.0)'; também tente colocar um DISPLAY=:0.0na frente de/usr/bin/think-dock
ish
Isso DISPLAYparece bom. Minhas whoexibições (:0)embora. Portanto, não acho que o grep seja melhor assim.
Martin Ueding 29/08/12
Ok, com o DISPLAYna frente bash, parece funcionar agora. Obrigado!
Martin Ueding 29/08/12
Ótimo! Meu whoteve 0.0, mas de qualquer maneira. Como funcionou, adicionarei a DISPLAYparte como resposta; por favor aceite. Obrigado!
Ish

Respostas:

7
  • O xrandr precisa saber de qual monitor você está falando, normalmente através da DISPLAYvariável de ambiente
  • root(no qual o udev é executado) não possui um DISPLAYconjunto padrão ; mesmo se ele / ela fez, su -cnão preserva o meio ambiente por padrão
  • Portanto, transmita-o explicitamente para o bash, e isso deve resolver seu problema, por exemplo:

    su -c "DISPLAY=:0.0 bash -x /usr/bin/think-dock $setto" "$user"
    
ish
fonte