xrandr ในขณะที่รูทไม่พบจอแสดงผล


9

ฉันมีกฎต่อไปนี้เรียกสคริปต์ของฉันเมื่อฉันเชื่อมต่อหรือเลิกเชื่อมต่อ 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"

นั่นคือสคริปต์ที่จะถูกเรียก:

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

xrandrและสคริปต์ที่ที่เรียกว่าแล้วทำอะไรบางอย่างกับ

สิ่งที่ฉันสามารถเรียกใช้think-dock onในฐานะผู้ใช้ของฉัน ( mu) และใช้งานได้ ฉันสามารถsudo -iและเรียกใช้think-dock-hook onและทำงานได้เช่นกัน แต่เมื่อฉันให้udevมันก็แค่ได้รับข้อผิดพลาดต่อไปนี้จากxrandr:

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

ตอนนี้ถ้าฉันโทรxrandrจากsudo -iเปลือกของฉันฉันจะได้รับ:

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

อย่างไรก็ตามถ้าฉันทำsu -c xrandr muจากsudo -iเปลือกของฉันฉันจะได้รับผลลัพธ์ที่คาดหวัง

ดังนั้นฉันจึงไม่เข้าใจจริงๆสคริปต์ที่เรียกว่าudevล้มเหลว


1
grep -F '(:0)'ควรจะgrep -F '(:0.0)'; ลองติดที่DISPLAY=:0.0ด้านหน้าของ/usr/bin/think-dock
ish

นั่นDISPLAYดูดีนะ whoแสดงของฉัน(:0)แม้ว่า ดังนั้นฉันไม่คิดว่า grep น่าจะดีกว่านี้
Martin Ueding

โอเคกับDISPLAYด้านหน้าbashดูเหมือนว่าจะทำงานตอนนี้ ขอบคุณ!
Martin Ueding

ที่ดี! ฉันwhoมี0.0แต่อย่างไรก็ตาม เนื่องจากมันใช้งานได้ฉันจะเพิ่มDISPLAYส่วนหนึ่งเป็นคำตอบ โปรดยอมรับมัน ขอบคุณ!
ish

คำตอบ:


7
  • xrandrจำเป็นต้องรู้ว่าจอแสดงผลที่คุณกำลังพูดถึงคืออะไรโดยทั่วไปผ่านDISPLAYตัวแปรสภาพแวดล้อม
  • root(ซึ่งudevทำงานเป็น) ไม่มีการDISPLAYตั้งค่าเริ่มต้น; แม้ว่าเขา / เธอทำsu -cไม่ได้รักษาสภาพแวดล้อมโดยค่าเริ่มต้น
  • ดังนั้นควรส่งผ่านไปอย่างชัดแจ้งเพื่อทุบตีและควรแก้ปัญหาของคุณเช่น:

    su -c "DISPLAY=:0.0 bash -x /usr/bin/think-dock $setto" "$user"
    
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.