Правило udev для подключения внешнего дисплея не работает

Правило udev для подключения внешнего дисплея не работает

Я создал свое самое первое правило udev для автоматической настройки моего внешнего дисплея при подключении моего ноутбука к док-станции. Как оказалось, оно не работает (какой сюрприз). Первым делом я проверил, какие события отправляются, когда я отключаю и подключаю свой внешний дисплей к док-станции (те же события происходят, когда я подключаю и отключаю саму док-станцию ​​от ноутбука с подключенным к ней внешним дисплеем). Вот вывод *монитор udevadm:

### CONNECTING EXTERNAL DISPLAY ###
KERNEL[12586.516063] change   /devices/pci0000:00/0000:00:01.1/0000:01:00.0/drm/card1 (drm)
UDEV  [12586.520032] change   /devices/pci0000:00/0000:00:01.1/0000:01:00.0/drm/card1 (drm)
KERNEL[12588.090123] change   /devices/pci0000:00/0000:00:01.1/0000:01:00.0/drm/card1 (drm)
UDEV  [12588.094088] change   /devices/pci0000:00/0000:00:01.1/0000:01:00.0/drm/card1 (drm)
### DISCONNECTING EXTERNAL DISPLAY ###
KERNEL[12577.885860] change   /devices/pci0000:00/0000:00:01.1/0000:01:00.0/drm/card1 (drm)
KERNEL[12577.885951] change   /devices/pci0000:00/0000:00:01.1/0000:01:00.0/drm/card1 (drm)
UDEV  [12577.894562] change   /devices/pci0000:00/0000:00:01.1/0000:01:00.0/drm/card1 (drm)
UDEV  [12577.900236] change   /devices/pci0000:00/0000:00:01.1/0000:01:00.0/drm/card1 (drm)

Вот мое правило udev:

KERNEL=="card1", SUBSYSTEM=="drm", ACTION=="change", RUN+="su vllblvck -c /usr/bin/setup-ext-display.sh"

А вот скрипт, который он должен запустить:

#!/bin/sh                                                                                                                                                                                       
# PLACE THIS SCRIPT INSIDE /usr/bin
# Automatically setup external monitor

xrandr_command="/usr/bin/xrandr"
sed_command="/bin/sed"

is_hdmi_connected=`DISPLAY=:0 $xrandr_command | $sed_command -n '/DP-1-2.3 connected/p'`
echo is_hdmi_connected: $is_hdmi_connected

if [ -n "$is_hdmi_connected" ]; then
  DISPLAY=:0 xrandr --output DP-1-2.3 --auto --right-of eDP-1 
  echo connecting
else
  DISPLAY=:0 $xrandr_command --output DP-1-2.3 --off
  echo disconnecting
fi

Сам скрипт работает просто отлично и делает то, что я хочу. Я даже переключился на пользователя root, чтобы проверить,су вллблвк -счасть работает правильно, и да, это так. Я запустил команду ниже, чтобы проверить, будет ли вообще выполняться правило, и предположительно оно будет выполняться, но на самом деле оно не выполняется или работает со сбоями, и мой внешний дисплей никогда не настраивается.

udevadm test --action="change" /devices/pci0000:00/0000:00:01.1/0000:01:00.0/drm/card1

Я был бы признателен за любые советы о том, как это исправить или отладить дальше, так как тема правил udev для меня новая, и у меня закончились идеи и поиски в Google. И если это имеет значение, я использую ArcoLinux с ядром 5.14.14-arch1-1.

решение1

Мне удалось исправить правило udev после многих попыток. Вот работающее правило:

KERNEL=="card1", SUBSYSTEM=="drm", ENV{DISPLAY}=":0", ENV{XAUTHORITY}="/home/vllblvck/.Xauthority", RUN+="/usr/bin/setup-ext-display.sh"

Не спрашивайте меня, почему это работает, а предыдущее — нет, потому что я понятия не имею. Может быть, кто-то более опытный с правилами udev мог бы нам рассказать.

Связанный контент