用于连接外部显示器的 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用户来检查是否苏 vllblvck -c部分工作正常,是的。我已经运行下面的命令来检查规则是否会执行,据说会执行,但实际上它不会执行或以某种方式出现故障,并且我的外部显示器从未设置。

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

我将不胜感激有关如何解决此问题或进一步调试此问题的任何提示,因为 udev 规则主题对我来说是新的,并且我已经没有想法和谷歌搜索了。如果这很重要,我正在运行带有 5.14.14-arch1-1 内核的 ArcoLinux。

答案1

经过多次尝试,我成功修复了我的 udev 规则。这是一个工作的:

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

不要问我为什么它有效,而前一个不起作用,因为我不知道。也许对 udev 规则更有经验的人可以告诉我们。

相关内容