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 on
jako mój użytkownik ( mu
) i działa. Mogę sudo -i
i biegam, think-dock-hook on
a to też działa. Ale kiedy pozwalam udev
go 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ę xrandr
z mojej sudo -i
powłoki, otrzymam:
No protocol specified
No protocol specified
Can't open display :0
Jednak jeśli zrobię to su -c xrandr mu
z mojej sudo -i
powłoki, otrzymam oczekiwany wynik.
Więc tak naprawdę nie rozumiem, skrypt wywoływany z udev
nie działa.
grep -F '(:0)'
powinno byćgrep -F '(:0.0)'
; także spróbować rzeźnickiegoDISPLAY=:0.0
z przodu/usr/bin/think-dock
DISPLAY
wydaje się dobre. Chociaż mojewho
wyświetlacze(:0)
. Więc nie sądzę, że grep byłby lepszy w ten sposób.DISPLAY
przodubash
wydaje się, że teraz działa. Dzięki!who
miał0.0
, ale i tak. Ponieważ zadziałało, dodam tęDISPLAY
część jako odpowiedź; proszę zaakceptuj to. Dzięki!Odpowiedzi:
DISPLAY
zmiennej środowiskowejroot
(który udev działa jako) nie maDISPLAY
ustawionego domyślnego ; nawet jeśli tak,su -c
domyślnie nie chroni środowiskaPrzekaż to wprost do bash, a to powinno rozwiązać twój problem, np .:
źródło