Следующее правило вызывает мой скрипт, когда я подключаю или отключаю 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
сбоев.
grep -F '(:0)'
должно бытьgrep -F '(:0.0)'
; также попробуйте наклеитьDISPLAY=:0.0
перед/usr/bin/think-dock
DISPLAY
кажется хорошим. Моиwho
показы(:0)
хотя. Поэтому я не думаю, что grep был бы лучше таким образом.DISPLAY
переднейbash
, кажется, работает сейчас. Спасибо!who
был0.0
, но все равно. Поскольку это сработало, я добавлюDISPLAY
часть в качестве ответа; пожалуйста, примите это. Спасибо!Ответы:
DISPLAY
переменную окруженияroot
(который запускает udev ) не имеетDISPLAY
установленного по умолчанию ; даже если он / она сделал,su -c
не сохраняет окружающую среду по умолчаниюТак что передайте это явно bash, и это должно решить вашу проблему, например:
источник