xrandr, ponieważ root nie może znaleźć wyświetlaczy

9

Podczas zadokowania lub oddokowania komputera ThinkPad mam następującą regułę: wywołaj mój skrypt:

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

Oto skrypt, który zostanie nazwany:

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

A następnie wywoływany skrypt coś z tym robi xrandr.

Chodzi o to, że mogę działać think-dock onjako mój użytkownik ( mu) i działa. Mogę sudo -ii biegam, think-dock-hook ona to też działa. Ale kiedy pozwalam udevgo uruchomić, pojawia się następujący błąd xrandr:

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

Teraz, gdy zadzwonię xrandrz mojej sudo -ipowłoki, otrzymam:

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

Jednak jeśli zrobię to su -c xrandr muz mojej sudo -ipowłoki, otrzymam oczekiwany wynik.

Więc tak naprawdę nie rozumiem, skrypt wywoływany z udevnie działa.

Martin Ueding
źródło
1
grep -F '(:0)'powinno być grep -F '(:0.0)'; także spróbować rzeźnickiego DISPLAY=:0.0z przodu/usr/bin/think-dock
owski
To DISPLAYwydaje się dobre. Chociaż moje whowyświetlacze (:0). Więc nie sądzę, że grep byłby lepszy w ten sposób.
Martin Ueding
Dobra, z DISPLAYprzodu bashwydaje się, że teraz działa. Dzięki!
Martin Ueding
Świetny! Mój whomiał 0.0, ale i tak. Ponieważ zadziałało, dodam tę DISPLAYczęść jako odpowiedź; proszę zaakceptuj to. Dzięki!
ish

Odpowiedzi:

7
  • xrandr musi wiedzieć, o którym ekranie mówisz, zwykle za pomocą DISPLAYzmiennej środowiskowej
  • root(który udev działa jako) nie ma DISPLAYustawionego domyślnego ; nawet jeśli tak, su -cdomyślnie nie chroni środowiska
  • Przekaż to wprost do bash, a to powinno rozwiązać twój problem, np .:

    su -c "DISPLAY=:0.0 bash -x /usr/bin/think-dock $setto" "$user"
    
ish
źródło