Ich habe die folgende Regel, die mein Skript aufruft, wenn ich mein ThinkPad an- oder ausdocke:
# /lib/udev/rules.d/81-thinkpad-dock.rules
KERNEL=="dock.0", ATTR{docked}=="0", RUN+="/usr/bin/think-dock-hook off"
KERNEL=="dock.0", ATTR{docked}=="1", RUN+="/usr/bin/think-dock-hook on"
Das ist das Skript, das aufgerufen wird:
# /usr/bin/think-dock-hook
# Find the user who is currently logged in on the primary screen.
user="$(who -u | grep -F '(:0)' | head -n 1 | awk '{print $1}')"
su -c "bash -x /usr/bin/think-dock $setto" "$user" >> /root/think-dock.log 2>&1 &
Und das Skript, das dann aufgerufen wird, macht etwas damit xrandr.
Die Sache ist, dass ich think-dock onals mein Benutzer ( mu) ausführen kann und es funktioniert. Ich kann sudo -iund renne think-dock-hook onund es funktioniert auch. Aber wenn ich es udevlaufen lasse , wird nur der folgende Fehler angezeigt xrandr:
# output of bash -x think-dock on
+ xrandr --output LVDS1 --auto
Can't open display
Wenn ich jetzt xrandrvon meiner sudo -iShell aus anrufe, bekomme ich:
No protocol specified
No protocol specified
Can't open display :0
Wenn ich dies jedoch su -c xrandr muvon meiner sudo -iShell aus tue , erhalte ich die erwartete Ausgabe.
Also ich verstehe nicht wirklich, das von aufgerufene Skript udevschlägt fehl.
DISPLAYscheint gut zu sein. Meine whoAnzeigen (:0)obwohl. Ich denke also nicht, dass grep so besser wäre.
DISPLAYvor bash, scheint es jetzt zu funktionieren. Vielen Dank!
whohatte 0.0, aber trotzdem. Da es funktioniert hat, werde ich das DISPLAYTeil als Antwort hinzufügen ; Bitte Akeptiere es. Vielen Dank!
grep -F '(:0)'sollte seingrep -F '(:0.0)'; versuchen Sie auch, einDISPLAY=:0.0vor/usr/bin/think-dock