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 on
como meu usuário ( mu
) e funciona. Eu posso sudo -i
correr think-dock-hook on
e funciona também. Mas quando deixei udev
executá-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 xrandr
do meu sudo -i
shell, recebo:
No protocol specified
No protocol specified
Can't open display :0
No entanto, se eu faço su -c xrandr mu
do meu sudo -i
shell, fico com a saída esperada.
Então, eu realmente não entendo, o script chamado from udev
falha.
grep -F '(:0)'
deveria sergrep -F '(:0.0)'
; também tente colocar umDISPLAY=:0.0
na frente de/usr/bin/think-dock
DISPLAY
parece bom. Minhaswho
exibições(:0)
embora. Portanto, não acho que o grep seja melhor assim.DISPLAY
na frentebash
, parece funcionar agora. Obrigado!who
teve0.0
, mas de qualquer maneira. Como funcionou, adicionarei aDISPLAY
parte como resposta; por favor aceite. Obrigado!Respostas:
DISPLAY
variável de ambienteroot
(no qual o udev é executado) não possui umDISPLAY
conjunto padrão ; mesmo se ele / ela fez,su -c
não preserva o meio ambiente por padrãoPortanto, transmita-o explicitamente para o bash, e isso deve resolver seu problema, por exemplo:
fonte