root olarak xrandr ekranları bulamıyor


9

ThinkPad'i taktığımda veya çıkardığımda şu kuralı çağırıyorum:

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

Bu çağrılacak komut dosyasıdır:

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

Ve sonra çağrılan komut dosyası ile bir şey yapar xrandr.

Şey think-dock onbenim kullanıcı ( mu) olarak çalışabilir ve çalışır. Çalışabilirim sudo -ive koşuyorum think-dock-hook onve o da işe yarıyor. Ama udevçalıştırmasına izin verdiğimde , sadece aşağıdaki hatayı alırsınız xrandr:

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

Şimdi çağırırsanız xrandrbenim dan sudo -ikabuk, alıyorum:

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

Yaparsam Ancak, su -c xrandr mubenim gelen sudo -ikabuk, beklediğimden çıktı alabilirsiniz.

Bu yüzden gerçekten anlamıyorum, denilen senaryo udevbaşarısız oluyor.


1
grep -F '(:0)'olmalı grep -F '(:0.0)'; Ayrıca DISPLAY=:0.0önünde bir yapışma deneyin/usr/bin/think-dock
— ish

Bu DISPLAYiyi görünüyor. Benim whogörüntüler (:0)rağmen. Bu yüzden grep'in bu şekilde daha iyi olacağını düşünmüyorum.
— Martin Ueding

Tamam, DISPLAYönü ile bashşimdi çalışıyor gibi görünüyor. Teşekkürler!
— Martin Ueding

Harika! Benim whovardı 0.0, ama yine de. Çalıştığı için DISPLAYparçayı bir cevap olarak ekleyeceğim ; lütfen kabul et. Teşekkürler!
— ish

Yanıtlar:


7
  • xrandr'ın hangi ekran hakkında konuştuğunuzu bilmesi gerekir, genellikle DISPLAYortam değişkeni üzerinden
  • root(hangi udev olarak çalışır) varsayılan DISPLAYayar yoktur ; yapsa bile su -c, çevreyi varsayılan olarak korumaz
  • Bu yüzden açıkça bash'a iletin ve bu sorununuzu çözmelidir, örneğin:

    su -c "DISPLAY=:0.0 bash -x /usr/bin/think-dock $setto" "$user"
    
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.