xrandr como root no puede encontrar pantallas

9

Tengo la siguiente regla que llama a mi secuencia de comandos cuando conecto o desconecto mi 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"

Ese es el guión que se llamará:

# /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 &

Y el guión que luego se llama hace algo con xrandr.

Lo que pasa es que puedo ejecutar think-dock oncomo mi usuario ( mu) y funciona. Puedo sudo -iy corro think-dock-hook ony funciona también. Pero cuando dejo udevejecutarlo, solo aparece el siguiente error de xrandr:

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

Ahora si llamo xrandrdesde mi sudo -ishell, obtengo:

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

Sin embargo, si lo hago su -c xrandr mudesde mi sudo -ishell, obtengo el resultado esperado.

Así que no entiendo realmente, el script llamado desde udevfalla.

Martin Ueding
fuente
1
grep -F '(:0)'debería ser grep -F '(:0.0)'; También intente pegarse DISPLAY=:0.0delante de/usr/bin/think-dock
ish
Eso DISPLAYparece bueno Mis whopantallas (:0)aunque. Así que no creo que grep sería mejor así.
Martin Ueding
Bien, con el DISPLAYfrente bash, parece funcionar ahora. ¡Gracias!
Martin Ueding
¡Excelente! Mi whotenía 0.0, pero de todos modos. Como funcionó, agregaré la DISPLAYparte como respuesta; por favor aceptalo. ¡Gracias!
ish

Respuestas:

7
  • xrandr necesita saber de qué pantalla está hablando, generalmente a través de la DISPLAYvariable de entorno
  • root(que udev se ejecuta como) no tiene un DISPLAYconjunto predeterminado ; incluso si lo hizo, su -cno preserva el medio ambiente por defecto
  • Así que pásalo explícitamente a bash, y eso debería resolver tu problema, por ejemplo:

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