J'ai la règle suivante appeler mon script lorsque je connecte ou déconnecte mon 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"
C'est le script qui s'appellera:
# /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 &
Et le script qui est alors appelé fait quelque chose avec xrandr
.
Le truc, c'est que je peux exécuter en think-dock on
tant qu'utilisateur ( mu
) et ça marche. Je peux sudo -i
et je cours think-dock-hook on
et ça marche aussi. Mais quand je le laisse l' udev
exécuter, il obtient juste l'erreur suivante de xrandr
:
# output of bash -x think-dock on
+ xrandr --output LVDS1 --auto
Can't open display
Maintenant, si j'appelle xrandr
depuis mon sudo -i
shell, j'obtiens:
No protocol specified
No protocol specified
Can't open display :0
Cependant, si je le fais su -c xrandr mu
depuis mon sudo -i
shell, j'obtiens la sortie attendue.
Donc je ne comprends pas vraiment, le script appelé depuis udev
échoue.
grep -F '(:0)'
devrait êtregrep -F '(:0.0)'
; essayez également de coller unDISPLAY=:0.0
devant/usr/bin/think-dock
DISPLAY
semble bien. Meswho
affichages cependant(:0)
. Je ne pense donc pas que grep serait mieux ainsi.DISPLAY
devantbash
, cela semble fonctionner maintenant. Merci!who
avait0.0
, mais de toute façon. Comme cela a fonctionné, je vais ajouter laDISPLAY
partie comme réponse; S'il te plait accepte-le. Merci!Réponses:
DISPLAY
variable d'environnementroot
(sous lequel udev s'exécute) n'a pas de valeur par défautDISPLAY
; même s'il l'a fait,su -c
ne préserve pas l'environnement par défautDonc, transmettez-le explicitement à bash, et cela devrait résoudre votre problème, par exemple:
la source