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.
DISPLAYtampaknya baik. whoDisplay saya (:0)sekalipun. Jadi saya tidak berpikir bahwa grep akan lebih baik seperti itu.
DISPLAYdi depan bash, sepertinya berfungsi sekarang. Terima kasih!
whopunya 0.0, tapi tetap saja. Karena berhasil, saya akan menambahkan DISPLAYbagian sebagai jawaban; mohon diterima. Terima kasih!
grep -F '(:0)'seharusnyagrep -F '(:0.0)'; juga mencoba menempelDISPLAY=:0.0di depan/usr/bin/think-dock