xrandr als root kann keine Anzeigen finden

9

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.

Martin Ueding
quelle
1
grep -F '(:0)'sollte sein grep -F '(:0.0)'; versuchen Sie auch, ein DISPLAY=:0.0vor/usr/bin/think-dock
ish
Das DISPLAYscheint gut zu sein. Meine whoAnzeigen (:0)obwohl. Ich denke also nicht, dass grep so besser wäre.
Martin Ueding
Okay, mit dem DISPLAYvor bash, scheint es jetzt zu funktionieren. Vielen Dank!
Martin Ueding
Toll! Mein whohatte 0.0, aber trotzdem. Da es funktioniert hat, werde ich das DISPLAYTeil als Antwort hinzufügen ; Bitte Akeptiere es. Vielen Dank!
ish

Antworten:

7
  • xrandr muss wissen, über welche Anzeige Sie sprechen, normalerweise über die DISPLAYUmgebungsvariable
  • root(welches udev läuft als) hat keine Standardeinstellung DISPLAY; Selbst wenn dies der su -cFall ist , wird die Umgebung nicht standardmäßig geschützt
  • Geben Sie es also explizit an bash weiter, und das sollte Ihr Problem lösen, z.

    su -c "DISPLAY=:0.0 bash -x /usr/bin/think-dock $setto" "$user"
    
ish
quelle