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.


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"
    
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.