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.


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"
    
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.