xrandr car root ne peut pas trouver d'affichages

9

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 ontant qu'utilisateur ( mu) et ça marche. Je peux sudo -iet je cours think-dock-hook onet ça marche aussi. Mais quand je le laisse l' udevexé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 xrandrdepuis mon sudo -ishell, j'obtiens:

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

Cependant, si je le fais su -c xrandr mudepuis mon sudo -ishell, j'obtiens la sortie attendue.

Donc je ne comprends pas vraiment, le script appelé depuis udevéchoue.

Martin Ueding
la source
1
grep -F '(:0)'devrait être grep -F '(:0.0)'; essayez également de coller un DISPLAY=:0.0devant/usr/bin/think-dock
ish
Cela DISPLAYsemble bien. Mes whoaffichages cependant (:0). Je ne pense donc pas que grep serait mieux ainsi.
Martin Ueding
D'accord, avec le DISPLAYdevant bash, cela semble fonctionner maintenant. Merci!
Martin Ueding
Génial! Mon whoavait 0.0, mais de toute façon. Comme cela a fonctionné, je vais ajouter la DISPLAYpartie comme réponse; S'il te plait accepte-le. Merci!
ish

Réponses:

7
  • xrandr a besoin de savoir de quel affichage vous parlez, généralement via la DISPLAYvariable d'environnement
  • root(sous lequel udev s'exécute) n'a pas de valeur par défaut DISPLAY; même s'il l'a fait, su -cne préserve pas l'environnement par défaut
  • Donc, transmettez-le explicitement à bash, et cela devrait résoudre votre problème, par exemple:

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