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

9

Следующее правило вызывает мой скрипт, когда я подключаю или отключаю 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сбоев.

Мартин Уединг
источник
1
grep -F '(:0)'должно быть grep -F '(:0.0)'; также попробуйте наклеить DISPLAY=:0.0перед/usr/bin/think-dock
иш
Это DISPLAYкажется хорошим. Мои whoпоказы (:0)хотя. Поэтому я не думаю, что grep был бы лучше таким образом.
Мартин Уединг
Хорошо, с DISPLAYпередней bash, кажется, работает сейчас. Спасибо!
Мартин Уединг
Большой! Мой whoбыл 0.0, но все равно. Поскольку это сработало, я добавлю DISPLAYчасть в качестве ответа; пожалуйста, примите это. Спасибо!
иш

Ответы:

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

    su -c "DISPLAY=:0.0 bash -x /usr/bin/think-dock $setto" "$user"
    
иш
источник