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 on
als mein Benutzer ( mu
) ausführen kann und es funktioniert. Ich kann sudo -i
und renne think-dock-hook on
und es funktioniert auch. Aber wenn ich es udev
laufen 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 xrandr
von meiner sudo -i
Shell aus anrufe, bekomme ich:
No protocol specified
No protocol specified
Can't open display :0
Wenn ich dies jedoch su -c xrandr mu
von meiner sudo -i
Shell aus tue , erhalte ich die erwartete Ausgabe.
Also ich verstehe nicht wirklich, das von aufgerufene Skript udev
schlägt fehl.
grep -F '(:0)'
sollte seingrep -F '(:0.0)'
; versuchen Sie auch, einDISPLAY=:0.0
vor/usr/bin/think-dock
DISPLAY
scheint gut zu sein. Meinewho
Anzeigen(:0)
obwohl. Ich denke also nicht, dass grep so besser wäre.DISPLAY
vorbash
, scheint es jetzt zu funktionieren. Vielen Dank!who
hatte0.0
, aber trotzdem. Da es funktioniert hat, werde ich dasDISPLAY
Teil als Antwort hinzufügen ; Bitte Akeptiere es. Vielen Dank!Antworten:
DISPLAY
Umgebungsvariableroot
(welches udev läuft als) hat keine StandardeinstellungDISPLAY
; Selbst wenn dies dersu -c
Fall ist , wird die Umgebung nicht standardmäßig geschütztGeben Sie es also explizit an bash weiter, und das sollte Ihr Problem lösen, z.
quelle