xrandr sebagai root tidak dapat menemukan tampilan

9

Saya memiliki aturan berikut untuk memanggil skrip ketika saya merapat atau melepas dok ThinkPad:

# /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"

Itulah skrip yang akan dipanggil:

# /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 &

Dan skrip yang kemudian disebut melakukan sesuatu dengan xrandr.

Masalahnya adalah bahwa saya dapat berjalan think-dock onsebagai pengguna saya ( mu) dan berfungsi. Saya bisa sudo -idan lari think-dock-hook ondan berhasil juga. Tetapi ketika saya membiarkan udevmenjalankannya, itu hanya mendapatkan kesalahan berikut dari xrandr:

# output of bash -x think-dock on
+ xrandr --output LVDS1 --auto
Can't open display

Sekarang jika saya menelepon xrandrdari sudo -ishell saya , saya mendapatkan:

No protocol specified
No protocol specified
Can't open display :0

Namun, jika saya lakukan su -c xrandr mudari sudo -ishell saya , saya mendapatkan output yang diharapkan.

Jadi saya tidak begitu mengerti, skrip dipanggil dari udevgagal.

Martin Ueding
sumber
1
grep -F '(:0)'seharusnya grep -F '(:0.0)'; juga mencoba menempel DISPLAY=:0.0di depan/usr/bin/think-dock
ish
Yang DISPLAYtampaknya baik. whoDisplay saya (:0)sekalipun. Jadi saya tidak berpikir bahwa grep akan lebih baik seperti itu.
Martin Ueding
Oke, dengan DISPLAYdi depan bash, sepertinya berfungsi sekarang. Terima kasih!
Martin Ueding
Bagus! Saya whopunya 0.0, tapi tetap saja. Karena berhasil, saya akan menambahkan DISPLAYbagian sebagai jawaban; mohon diterima. Terima kasih!
ish

Jawaban:

7
  • xrandr perlu tahu tampilan mana yang sedang Anda bicarakan, biasanya melalui DISPLAYvariabel lingkungan
  • root(yang menjalankan udev sebagai) tidak memiliki DISPLAYset default ; bahkan jika dia melakukannya, su -ctidak melestarikan lingkungan secara default
  • Jadi berikan secara eksplisit ke bash, dan itu akan menyelesaikan masalah Anda, misalnya:

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