जब एक मॉनिटर प्लग या अनप्लग किया जाता है तो मैं कैसे पता लगा सकता हूं?


53

क्या कोई ऐसी घटना है जो मेरे लैपटॉप के DisplayPort में बाहरी मॉनिटर को प्लग या इन करते समय चालू हो जाती है? ACPID और UDEV बिल्कुल भी प्रतिक्रिया नहीं करते हैं।

मैं एक इंटेल चिप पर जहाज पर ग्राफिक्स का उपयोग कर रहा हूं। यहाँ एक ऐसी ही चर्चा है जो पहले से ही कुछ साल पुरानी है।

मैं मतदान का उपयोग नहीं करना चाहता, लेकिन मुझे कुछ कॉन्फ़िगरेशन की आवश्यकता है जो कि डिस्प्ले से कनेक्ट होने के आधार पर प्रदर्शन सेटिंग्स को स्वचालित रूप से सेट करता है।


4
यह udv के साथ किया जा सकता है। आपका कर्नेल संस्करण क्या है? क्या आप KMS (कर्नेल मोड सेटिंग) का उपयोग कर रहे हैं?
एंडी

जवाब के लिए धन्यवाद। मुझे केएमएस के बारे में निश्चित नहीं है, लेकिन जैसा कि मैंने सवाल में कहा था, udv कोई भी घटना नहीं भेजता है। ( udevadm मॉनीटर - प्रोपर्टी बिल्कुल भी प्रतिक्रिया नहीं करता है)
जैनोलिवर

@ और: पिछली बार जब यह सामने आया , तो ऐसा लगा कि अधिकांश प्रणालियों को मतदान की आवश्यकता थी। यदि आपको एक udev घटना को ट्रिगर करने का एक तरीका मिल गया है, तो क्या आप उस प्रश्न का उत्तर दे सकते हैं?
गिलेस एसओ- बुराई को रोकें '25

1
मैं अंत में इसे कर्लिंग मॉड्यूल के रूप में लोडिंग i915 चला रहा हूं।
जौलीवर

3
यदि बाह्य मॉनिटर में खामियों को दूर कर दिया गया है पता लगाने के लिए xrandr या disper उपयोग कर सकते हैं। Github.com/wertarbyte/autorandr उनके उपयोग का तरीका आप दिखा सकते हैं। लेकिन xrandr / disper ने आपके वीडियो कार्ड का समर्थन नहीं किया।
नंबर

जवाबों:


13

नोट: यह एक i915 संचालित ग्राफिक्स कार्ड के साथ एक लैपटॉप पर परीक्षण किया गया था।


पृष्ठभूमि

नोट: जब एक नई स्क्रीन प्लग की जाती है, तो कोई भी आयोजन होस्ट को नहीं भेजा जाता है, यह मेरे अंतिम संपादन के बाद भी सही रहा। इसलिए एकमात्र तरीका मतदान का उपयोग करना है। जितना संभव हो उतने ही सहज बनाने की कोशिश ...

EDIT # 3

अंत में एक बेहतर समाधान है (ACPI के माध्यम से):

अभी भी कोई घटना नहीं है, लेकिन ACPI xrandrपूछताछ करने की तुलना में अधिक कुशल लगता है । (नोट: इसके लिए एसीपीआई कर्नेल मॉड्यूल लोड किए गए हैं, लेकिन रूट विशेषाधिकारों की आवश्यकता नहीं है)।

मेरा अंतिम समाधान (बाश का उपयोग करके):

isVgaConnected() {
    local crtState
    read -a < /proc/acpi/video/VID/CRT0/state crtState
    test $(( ( ${crtState[1]} >>4 ) ${1:+*-1+1} )) -ne 0
}

अब एक परीक्षण:

$ if isVgaConnected; then echo yes; else echo no; fi 
yes

इसमें प्लग किया गया है, इसलिए अब मैं इसे अनप्लग करता हूं:

$ if isVgaConnected; then echo yes; else echo no; fi 
no

नोट: ${1:+*-1+1} एक बूलियन तर्क की अनुमति दें: यदि कुछ मौजूद है , तो उत्तर उल्टा होगा ( crtState >> 4 ) * -1 + 1:।

और अंतिम स्क्रिप्ट:

#!/bin/bash

export crtProcEntry=/proc/acpi/video/VID/CRT0/state

isVgaConnected() {
    local crtState
    read -a < $crtProcEntry crtState
    test $(( ( ${crtState[1]} >>4 ) ${1:+*-1+1} )) -ne 0
}

delay=.1
unset switch
isVgaConnected || switch=not
while :;do
    while isVgaConnected $switch;do
        sleep $delay
      done
    if [ "$switch" ];then
        unset switch
        echo VGA IS connected
        # doing something while VGA is connected
      else
        switch=not
        echo VGA is NOT connected.
        # doing something else, maybe.
      fi
  done

चेतावनी: लाइटर की तुलना में xrandr, लेकिन 0.02 सेकंड से कम की देरी के साथ महत्वहीन नहीं , बैश स्क्रिप्ट संसाधन खाने वालों की प्रक्रिया के शीर्ष पर जाएगी ( top)!

जबकि यह लागत ~ 0.001 सेकंड है:

$ time read -a </proc/stat crtStat

इसके लिए ~ 0.030 सेकंड की आवश्यकता है:

$ read -a < /proc/acpi/video/VID/CRT0/state crtState

यह बड़ा है! तो आप क्या जरूरत पर निर्भर करता है, delayयथोचित 0.5और के बीच सेट किया जा सकता है 2

EDIT # 2

मैंने आखिरकार, इसका उपयोग करते हुए कुछ पाया है:

महत्वपूर्ण अस्वीकरण: साथ खेलना /procऔर /sysप्रविष्टियां आपके सिस्टम को तोड़ सकती हैं !!! तो उत्पादन प्रणाली पर निम्नलिखित की कोशिश मत करो।

mapfile watchFileList < <(
    find /sys /proc -type f 2>/dev/null |
    grep -i acpi\\\|i91 
)

prompt=("/" "|" '\' '-');

l=0
while :; do
  mapfile watchStat < <(
    grep -H . ${watchFileList[@]} 2>/dev/null
  )

  for ((i=0;i<=${#watchStat[@]};i++)); do
    [ "${watchStat[i]}" == "${oldStat[i]}" ] || echo ${watchStat[i]}
  done

  oldStat=("${watchStat[@]}")
  sleep .5
  printf "\r%s\r" ${prompt[l++]}
  [ $l -eq 4 ]&&l=0
done

... अवांछित प्रविष्टि की कुछ सफाई के बाद:

for ((i=0;i<=${#watchFileList[@]};i++)); do
  [[ "${watchFileList[$i]}" =~ /sys/firmware/acpi/interrupts/sci ]] &&
      unset watchFileList[$i] && echo $i
done

मैं इसे पढ़ पा रहा हूं:

/proc/acpi/video/VID/CRT0/state:state: 0x1d
/proc/acpi/video/VID/CRT0/state:state: 0x0d
/proc/acpi/video/VID/CRT0/state:state: 0x1d

जब मैं प्लग, अनप्लग, और मॉनिटर केबल में फिर से भरना।

मूल उत्तर

जब कॉन्फिगर की पूछताछ (रनिंग system/preferences/monitorया xrandr) की जाती है, तो ग्राफिक्स कार्ड एक प्रकार का स्कैन करते हैं , इसलिए रनिंग xrandr -qआपको इसकी जानकारी देता है, लेकिन आपको स्टेटस को प्रदूषित करना होगा।

मैं सभी लॉग, (कर्नेल, डेमॉन, एक्स और आगे) के माध्यम से खोज स्कैन किया है /procऔर /sys, और स्पष्ट रूप से कुछ भी नहीं अस्तित्व के लिए, जो आपके अनुरोध को संतुष्ट करता है लगता है।

मैंने यह भी कोशिश की है:

export spc50="$(printf "%50s" "")"
watch -n1  '
    find /proc/acpi/video -type f |
        xargs grep -H . |
        sed "s/^\([^:]*):/\1'$spc50'}:/;
             s/^\(.\{50\}\) *:/\1 /"'

आखिरकार, यदि आप चलाते हैं, System/Preferences/Monitorजबकि कोई नई स्क्रीन अभी प्लग नहीं की गई है, और न ही अनप्लग की गई है, तो टूल बस (सामान्य रूप से) दिखाई देगा। लेकिन अगर आपने किसी स्क्रीन को पहले प्लग या अनप्लग किया है, तो कई बार आप इस टूल को चलाएंगे और आप देखेंगे कि आपका डेस्कटॉप एक प्रकार का रीसेट या रिफ्रेश (जैसा कि आप चलाते हैं xrandr) करते हैं।

यह पुष्टि करता है कि यह उपकरण xrandrसमय-समय पर मतदान की स्थिति के अनुसार (या उसी तरीके से काम करता है), जिस समय इसे चलाया जाता है, शुरू होता है।

आप खुद कोशिश कर सकते हैं:

$ for ((i=10;i--;)); do xrandr -q | grep ' connected' | wc -l; sleep 1; done
1
1
1
2
2
2
1
1
1
1

यह प्रदर्शित करेगा कि 10 सेकंड के लिए कितने स्क्रीन (डिस्प्ले) जुड़े हुए हैं।

जबकि यह चलता है, प्लग और / या अपनी स्क्रीन को अनप्लग करें / मॉनिटर करें और देखें कि क्या होता है। तो आप थोड़ा बैश टेस्ट फंक्शन बना सकते हैं:

isVgaConnected() {
    local xRandr=$(xrandr -q)
    [ "$xRandr" == "${xRandr#*VGA1 con}" ] || return 0
    return 1
}

जो के रूप में प्रयोग करने योग्य होगा:

$ if isVgaConnected; then echo yes; fi

लेकिन सावधान रहें, xrandrलगभग 0.140 सेकंड से 0.200 सेकंड तक का समय लगता है जबकि प्लग में कोई परिवर्तन नहीं होता है और 0.700 सेकंड तक जब भी कुछ प्लग किया गया था या अनप्लग किया गया था ( नोट: ऐसा लगता है कि संसाधन भक्षक नहीं है)।

EDIT # 1

यह सुनिश्चित करने के लिए कि मैं कुछ गलत नहीं सिखा रहा हूं, मैंने वेब और डॉक्स के आसपास खोज की है, लेकिन डीबस और स्क्रीन के बारे में कुछ नहीं पाया ।

अंत में, मैं दो अलग-अलग विंडो में चला गया dbus-monitor --systemहूं (मैं विकल्पों के साथ भी खेल रहा हूं) और छोटी स्क्रिप्ट जो मैंने लिखी है:

$ for ((i=1000;i--;)); do isVgaConnected && echo yes || echo no; sleep .5; done

... और फिर से प्लग, अनप्लग किए गए मॉनिटर की तुलना में, कई बार। तो अब मैं कह सकता था:

  • इस कॉन्फ़िगरेशन में, i915 ड्राइवर का उपयोग करते हुए , यह xrandr -qजानने के लिए दौड़ने के अलावा कोई अन्य तरीका नहीं है कि कोई मॉनिटर प्लग किया गया है या नहीं।

लेकिन सावधानी बरतें, क्योंकि अन्य तरीके नहीं दिखते। उदाहरण के लिए, xrandrइस जानकारी को साझा करना प्रतीत होता है, इसलिए मेरा गनोम डेस्कटॉप xineramaस्वचालित रूप से स्विच हो जाएगा ... जब मैं भाग गयाxrandr

कुछ डॉक्स


4

निम्नलिखित पंक्तियों में दिखाई दिया udevadm monitor

KERNEL[46578.184280] change   /devices/pci0000:00/0000:00:02.0/drm/card0 (drm)
UDEV  [46578.195887] change   /devices/pci0000:00/0000:00:02.0/drm/card0 (drm)

जब वीजीए-कनेक्टर को मॉनिटर संलग्न करना। तो यह पता लगाने का एक तरीका हो सकता है।


एक nVidia 9800 GT और मालिकाना ड्राइवरों के साथ, udvadm मॉनिटर कुछ भी नहीं दिखाता है जब मैं एक HDMI मॉनिटर कनेक्ट करता हूं। क्या हार्डवेयर / ड्राइवर आप उपयोग कर रहे हैं?
फ्रैंकफर्ट

अफ़सोस की बात है, यह मेरे लिए विश्वसनीय काम नहीं करता है। कभी-कभी मुझे इन घटनाओं के संदेश मिलते हैं जब मैं अपने मॉनिटर में प्लग-इन करता हूं और कभी-कभी नहीं।
टोबियास

3

जो लोग, जो भी कारण के लिए, हॉटप्लग मार्ग नहीं लेना चाहते हैं, यह अभी भी एक स्क्रिप्ट के भीतर चुनाव नहीं करना संभव है inotifywait का उपयोग कर:

#! / Bin / bash

SCREEN_LEFT = DP2
SCREEN_RIGHT = eDP1
START_DELAY = 5

renice +19 $$> / देव / अशक्त

$ $ START_DELAY सोएं

OLD_DUAL = "डमी"

जबकि [1]; करना
    DUAL = $ (बिल्ली / एसआईएस / वर्ग / ड्रम / कार्ड0-डीपी -2 / स्थिति)

    अगर ["$ OLD_DUAL"! = "$ DUAL"]; फिर
        अगर ["$ DUAL" == "कनेक्टेड"]; फिर
            गूंज 'दोहरी निगरानी सेटअप'
            xrandr --output $ SCREEN_LEFT --auto - सामान्य को समेटें - 0x0 --output $ SCREEN_RIGHT --auto - को सामान्य करें - $ को खोलें
        अन्य
            इको 'सिंगल मॉनिटर सेटअप'
            xrandr - औटो
        फाई

        OLD_DUAL = "$ दोहरी"
    फाई

    inotifywait -q -e close / sys / class / drm / card0-DP-2 / status> / / / सुस्त
किया हुआ

यह सबसे अच्छा अपने .xsessionrc से लगाया जाता है, अंत को भूलकर नहीं। Xrandr के साथ मतदान ने मेरे ब्रांड के नए लैपटॉप (माउस को समय-समय पर स्टाल किया जाएगा) पर गंभीर प्रयोज्य मुद्दे दिए।


मैंने सोचा था कि नहीं होता है कि आप inotify पर उपयोग कर सकते हैं /procऔर बस कर inotifywait -q -e close /sys/class/drm/card0-DP-2/status वास्तव में अपने सिस्टम पर डी पी -2 डिस्कनेक्ट करने पर खत्म नहीं हुई
nhed

3

मैं श्रंद का उपयोग करने के लिए अटक गया । जब कोई डिस्प्ले कनेक्ट या डिस्कनेक्ट हो जाता है तो यह एक्स इवेंट्स को मॉनिटर करता है और आपकी स्क्रिप्ट को ट्रिगर करता है।


0

जाहिर है कि कुछ होना चाहिए! : लिनक्स दो हॉटप्लग इंटरफेस प्रदान करता है: / sbin / hotplug और netlink।

निम्न फ़ाइल में एक छोटा सी डेमो है। http://www.kernel.org/doc/pending/hotplug.txt


0

लिनक्स पर ज्यादातर सिस्टम / एप्लिकेशन सॉफ्टवेयर ने आज एक दूसरे के साथ संचार के लिए कुछ आईपीसी तकनीकों का उपयोग किया। डी-बस अब ज्यादातर गनोम अनुप्रयोगों के साथ प्रयोग किया जाता है, और मदद कर सकता है।

लिनक्स जर्नल:

डी-बस सिस्टम के माध्यम से घटनाओं या संकेतों को भेजने की सुविधा प्रदान कर सकता है, सिस्टम में विभिन्न घटकों को संवाद करने और अंततः बेहतर एकीकृत करने की अनुमति देता है। उदाहरण के लिए, एक ब्लूटूथ डीमॉन एक इनकमिंग कॉल सिग्नल भेज सकता है जिसे आपका म्यूजिक प्लेयर इंटरसेप्ट कर सकता है, कॉल खत्म होने तक वॉल्यूम म्यूट कर सकता है।

विकि:

डी-बस एक सिस्टम डेमॉन ("नए हार्डवेयर डिवाइस जोड़े गए" या "प्रिंटर कतार परिवर्तित" जैसी घटनाओं के लिए) और प्रति उपयोगकर्ता-लॉगिन-सत्र डेमन (उपयोगकर्ता अनुप्रयोगों के बीच सामान्य अंतर-प्रक्रिया संचार आवश्यकताओं के लिए) दोनों की आपूर्ति करता है

यहां तक ​​कि इसके लिए एक पायथन लाइब्रेरी भी है, और उबंटू ने हाल ही में इस क्षमता का उपयोग किया है जिसे " ज़ीजेटिस्ट " कहा जाता है ।


-6

ग्राफिक रूप से आप देख सकते हैं कि क्या मॉनिटर के साथ मान्यता प्राप्त है Monitor, मुझे पता है कि आप इसे उबंटू, फेडोरा और अन्य (या इसी तरह के) स्थान पर पा सकते हैं।

सिस्टम / पसंद / मॉनिटर

और आप किसी भी मॉनीटर को चालू या बंद कर सकते हैं या एक ही समय में डुप्लिकेट छवि के साथ मॉनीटर या स्वतंत्र मॉनीटर दोनों में उपयोग कर सकते हैं


2
उन्होंने कहा कि एक घटना के लिए कहा है कि जब एक मॉनिटर प्लग किया गया है / अनप्लग शुरू हो रहा है
माइकल Mrozek

क्या तुमने यहाँ देखा? stackoverflow.com/questions/5469828/…
सतीश
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.