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)хоча. Тому я не думаю, що греп був би кращим таким чином.
Мартін Удінг

Гаразд, з 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"
    
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.