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.