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.


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"
    
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.