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.


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"
    
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.