랩탑이 도크에 연결될 때 외부 모니터를 자동으로 설정하기 위해 첫 번째 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
스크립트 자체는 잘 작동하고 내가 원하는 작업을 수행합니다. 심지어 루트 사용자로 전환하여 확인했습니다.su vllblvck -c네, 부분적으로 일하고 있습니다. 규칙이 실행되는지 확인하기 위해 아래 명령을 실행했는데 예상대로 실행되지만 실제로는 실행되지 않거나 어떻게든 결함이 발생하고 외부 모니터가 설정되지 않습니다.
udevadm test --action="change" /devices/pci0000:00/0000:00:01.1/0000:01:00.0/drm/card1
udev 규칙 주제가 처음이고 아이디어와 Google 검색이 부족하므로 이 문제를 해결하거나 추가 디버깅하는 방법에 대한 팁을 주시면 감사하겠습니다. 이것이 중요하다면 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 규칙에 대해 더 경험이 많은 사람이 우리에게 말해 줄 수 있습니다.