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 on
como mi usuario ( mu
) y funciona. Puedo sudo -i
y corro think-dock-hook on
y funciona también. Pero cuando dejo udev
ejecutarlo, 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 xrandr
desde mi sudo -i
shell, obtengo:
No protocol specified
No protocol specified
Can't open display :0
Sin embargo, si lo hago su -c xrandr mu
desde mi sudo -i
shell, obtengo el resultado esperado.
Así que no entiendo realmente, el script llamado desde udev
falla.
grep -F '(:0)'
debería sergrep -F '(:0.0)'
; También intente pegarseDISPLAY=:0.0
delante de/usr/bin/think-dock
DISPLAY
parece bueno Miswho
pantallas(:0)
aunque. Así que no creo que grep sería mejor así.DISPLAY
frentebash
, parece funcionar ahora. ¡Gracias!who
tenía0.0
, pero de todos modos. Como funcionó, agregaré laDISPLAY
parte como respuesta; por favor aceptalo. ¡Gracias!Respuestas:
DISPLAY
variable de entornoroot
(que udev se ejecuta como) no tiene unDISPLAY
conjunto predeterminado ; incluso si lo hizo,su -c
no preserva el medio ambiente por defectoAsí que pásalo explícitamente a bash, y eso debería resolver tu problema, por ejemplo:
fuente