Udev-Regel zum Anschließen eines externen Displays funktioniert nicht

Udev-Regel zum Anschließen eines externen Displays funktioniert nicht

Ich habe meine allererste udev-Regel erstellt, um mein externes Display automatisch einzurichten, wenn ich meinen Laptop an die Dockingstation anschließe. Wie sich herausstellt, funktioniert es nicht (was für eine Überraschung). Als Erstes habe ich überprüft, welche Ereignisse gesendet werden, wenn ich mein externes Display von der Dockingstation abziehe und wieder anschließe (dieselben Ereignisse treten auf, wenn ich die Dockingstation selbst an den Laptop anschließe und wieder trenne, an dem das externe Display angeschlossen ist). Hier ist die Ausgabe von *udevadm-Monitor:

### 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)

Hier ist meine Udev-Regel:

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

Und hier ist das Skript, das ausgeführt werden soll:

#!/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

Das Skript selbst funktioniert einwandfrei und tut, was ich will. Ich habe sogar zum Root-Benutzer gewechselt, um zu prüfen, obsu vllblvck -cTeil funktioniert richtig und ja, das tut es. Ich habe den folgenden Befehl ausgeführt, um zu prüfen, ob die Regel überhaupt ausgeführt wird, und angeblich würde sie das, aber in Wirklichkeit wird sie das nicht oder weist eine Fehlfunktion auf und mein externes Display wird nie eingerichtet.

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

Ich würde mich über Tipps freuen, wie ich das Problem beheben oder weiter debuggen kann, da das Thema Udev-Regeln für mich neu ist und mir die Ideen und Google-Suchen ausgegangen sind. Und falls das hier wichtig ist: Ich verwende ArcoLinux mit dem Kernel 5.14.14-arch1-1.

Antwort1

Nach vielen Versuchen ist es mir gelungen, meine Udev-Regel zu reparieren. Hier ist eine funktionierende Regel:

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

Fragen Sie mich nicht, warum es funktioniert und das vorherige nicht, denn ich habe keine Ahnung. Vielleicht kann uns jemand, der mehr Erfahrung mit Udev-Regeln hat, das sagen.

verwandte Informationen