xrandr रूट के रूप में डिस्प्ले नहीं मिल सकते हैं


9

जब मेरा डॉक या अन-डॉक मेरी थिंकपैड है, तो मुझे निम्नलिखित नियम मेरी स्क्रिप्ट कहते हैं:

# /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 बेहतर होगा।
— मार्टिन उडिंग

ठीक है, DISPLAYसामने के साथ bash, यह अब काम करने लगता है। धन्यवाद!
— मार्टिन उडिंग

महान! मेरा 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"
    
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.