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 on
sebagai pengguna saya ( mu
) dan berfungsi. Saya bisa sudo -i
dan lari think-dock-hook on
dan berhasil juga. Tetapi ketika saya membiarkan udev
menjalankannya, 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 xrandr
dari sudo -i
shell saya , saya mendapatkan:
No protocol specified
No protocol specified
Can't open display :0
Namun, jika saya lakukan su -c xrandr mu
dari sudo -i
shell saya , saya mendapatkan output yang diharapkan.
Jadi saya tidak begitu mengerti, skrip dipanggil dari udev
gagal.
grep -F '(:0)'
seharusnyagrep -F '(:0.0)'
; juga mencoba menempelDISPLAY=:0.0
di depan/usr/bin/think-dock
DISPLAY
tampaknya baik.who
Display saya(:0)
sekalipun. Jadi saya tidak berpikir bahwa grep akan lebih baik seperti itu.DISPLAY
di depanbash
, sepertinya berfungsi sekarang. Terima kasih!who
punya0.0
, tapi tetap saja. Karena berhasil, saya akan menambahkanDISPLAY
bagian sebagai jawaban; mohon diterima. Terima kasih!Jawaban:
DISPLAY
variabel lingkunganroot
(yang menjalankan udev sebagai) tidak memilikiDISPLAY
set default ; bahkan jika dia melakukannya,su -c
tidak melestarikan lingkungan secara defaultJadi berikan secara eksplisit ke bash, dan itu akan menyelesaikan masalah Anda, misalnya:
sumber