xrandr как root не может найти дисплеи

У меня есть следующее правило, вызывающее мой сценарий, когда я подключаю или отключаю свой 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"

Это будет сценарий, который будет вызываться:

# /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 &

И скрипт, который затем вызывается, что-то делает с xrandr.

Дело в том, что я могу запустить think-dock on как мой пользователь (mu), и это работает. Я могу sudo -i и запустить think-dock-hook on, и это тоже работает. Но когда я позволю udev запустить его, он просто получит следующую ошибку из xrandr:

# output of bash -x think-dock on
+ xrandr --output LVDS1 --auto
Can't open display

Теперь, если я вызову xrandr из моей оболочки sudo -i, я получу:

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

Однако, если я сделаю su -c xrandr mu из моей оболочки sudo -i, я получу ожидаемый результат.

Так что я не совсем понимаю, сценарий, вызванный из udev, не работает.

9
задан 16 August 2012 в 01:55

1 ответ

  • xrandr должен знать, какой дисплей Вы говорите о, обычно через DISPLAY, переменная среды
  • root (который выполнения udev как) не имеет никакого значения по умолчанию DISPLAY набор; даже если он сделал, su -c не сохраняет среду значением по умолчанию
  • , Так проведите его явно для избиения, и это должно решить проблему, например:

    su -c "DISPLAY=:0.0 bash -x /usr/bin/think-dock $setto" "$user"
    
7
ответ дан 16 August 2012 в 01:55

Другие вопросы по тегам:

Похожие вопросы: