যখন কোনও মনিটর প্লাগ ইন করা বা প্লাগ ইন করা হয় তখন আমি কীভাবে সনাক্ত করতে পারি?


53

আমার ল্যাপটপের ডিসপ্লেপোর্ডে কোনও বাহ্যিক মনিটর প্লাগ ইন বা আউট করার সময় কি এমন কোনও ঘটনা ঘটিয়েছে? এসিপিআইডি এবং ইউডিইভি একেবারেই প্রতিক্রিয়া জানায় না।

আমি একটি ইন্টেল চিপে অনবোর্ড গ্রাফিক্স ব্যবহার করছি। এখানে ইতিমধ্যে কয়েক বছরের পুরানো সমান আলোচনা রয়েছে।

আমি পোলিং ব্যবহার করতে চাই না তবে আমার কিছু কনফিগারেশন থাকা দরকার যা ডিসপ্লেটি সংযুক্ত রয়েছে কিনা তা নির্ভর করে স্বয়ংক্রিয়ভাবে প্রদর্শন সেটিংস সেট করে।


4
এটি উদেব দিয়ে করা যেতে পারে। আপনার কার্নেল সংস্করণটি কী? আপনি কি কেএমএস (কার্নেল মোড সেটিংস) ব্যবহার করছেন?
অ্যান্ডি

উত্তরের জন্য ধন্যবাদ. আমি কেএমএস সম্পর্কে নিশ্চিত নই, তবে আমি যেমন প্রশ্নে বলেছিলাম, উদেব কোনও ইভেন্ট প্রেরণ করে না। ( udevadm মনিটর
প্রপার্টি

@ অ্যান্ডি: শেষবারের মতো উঠে এসে দেখে মনে হয়েছিল বেশিরভাগ সিস্টেমে ভোট দেওয়ার দরকার পড়ে। যদি আপনি কোনও উদেব ইভেন্টটি ট্রিগার করার কোনও উপায় খুঁজে পেয়েছেন তবে আপনি কি এই প্রশ্নের উত্তর দিতে পারবেন?
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

1
আমি অবশেষে এটি কার্নেল মডিউল হিসাবে i915 লোড করে চলতে পেয়েছি।
জানলিভার

3
যদি বাহ্যিক মনিটর প্লাগ ইন করা হয়েছে সনাক্ত করতে xrandr বা disper ব্যবহার করতে পারেন। Github.com/wertarbyte/autorandr কিভাবে তাদের ব্যবহার করতে আপনাকে দেখাতে পারবেন না। তবে xrandr / disper আপনার ভিডিও কার্ডকে সমর্থন করবে না।
সংখ্যা

উত্তর:


13

দ্রষ্টব্য: এটি একটি আই 915 চালিত গ্রাফিক্স কার্ড সহ একটি ল্যাপটপে পরীক্ষা করা হয়েছিল।


পটভূমি

দ্রষ্টব্য: যখন কোনও নতুন স্ক্রিন প্লাগ ইন করা হয় তখন হোস্টের কাছে কোনও ইভেন্ট প্রেরণ করা হয় না, এটি আমার শেষ সম্পাদনার পরেও সত্য থেকে যায়। সুতরাং একমাত্র উপায় হ'ল পোলিং ব্যবহার করা। এগুলি যথাসম্ভব কার্যকর করার চেষ্টা করা হচ্ছে ...

সম্পাদনা # 3

অবশেষে আরও একটি ভাল সমাধান রয়েছে (এসিপিআইয়ের মাধ্যমে):

এখনও কোনও ইভেন্ট নেই, তবে এসিপিআই xrandrতদন্তের চেয়ে আরও দক্ষ বলে মনে হচ্ছে । (নোট: এই প্রয়োজন ACPI সংক্রান্ত কার্নেল মডিউল লোড কিন্তু root ব্যবহারকারীর অধিকার উপস্থিত প্রয়োজন হয় না)।

আমার চূড়ান্ত সমাধান (ব্যাশ ব্যবহার করে):

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

এটির জন্য 30 0.030 সেকেন্ডের প্রয়োজন:

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

এই বড়! সুতরাং আপনার যা প্রয়োজন তার উপর নির্ভর করে delayযুক্তিসঙ্গতভাবে 0.5এবং এর মধ্যে সেট করা যেতে পারে 2

সম্পাদনা # 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 সেকেন্ড যখনই কিছু প্লাগ বা সংযুক্ত করা হয় ঠিক আগে ( উল্লেখ্য: এটি একটি সম্পদ ভক্ষক হতে বলে মনে হয়)।

সম্পাদনা # 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)

যখন ভিজিএ-সংযোজকের সাথে একটি মনিটর সংযুক্ত করা হয়। সুতরাং এটি খুঁজে বের করার একটি উপায় থাকতে পারে।


একটি এনভিডিয়া 9800 জিটি এবং মালিকানাধীন ড্রাইভারগুলির সাথে, যখন আমি এইচডিএমআই মনিটরটি সংযুক্ত করি তখন উদেবডম মনিটর কিছুই দেখায় না। আপনি কোন হার্ডওয়্যার / ড্রাইভার ব্যবহার করছেন?
ফ্রাঙ্কস্টার

করুণভাবে, এটি আমার পক্ষে নির্ভরযোগ্য কাজ করে না। কখনও কখনও আমি আমার মনিটরের প্লাগ-ইন করি এবং কখনও কখনও না থাকিলে আমি এই ইভেন্টের বার্তাগুলি পাই।
টোবিয়াস

3

যারা, যে কোনও কারণেই হটপ্লাগ রুটটি নিতে চান না, এখনও ইনোটিফয়েট ব্যবহার করে কোনও স্ক্রিপ্টের মধ্যে পোল না দেওয়া সম্ভব:

#! / বিন / ব্যাশ

SCREEN_LEFT = DP2
SCREEN_RIGHT = eDP1
START_DELAY = 5

renice +19 /> / dev / নাল

ঘুম $ START_DELAY

OLD_DUAL = "ডামি"

যখন [1]; করা
    ডুয়াল = $ (বিড়াল / সিএস / শ্রেণি / ড্রাম / কার্ড0-ডিপি -২ / স্থিতি)

    যদি ["$ OLD_DUAL"! = "$ ডুয়াল"]; তারপর
        যদি ["$ ডুয়াল" == "সংযুক্ত"]; তারপর
            প্রতিধ্বনি 'ডুয়াল মনিটর সেটআপ'
            xrandr - আউটপুট $ SCREEN_LEFT - আউটো - নোট সাধারণ
        আর
            প্রতিধ্বনি 'একক মনিটর সেটআপ'
            xrandr --auto
        ফাই

        OLD_DUAL = "$ দ্বৈত"
    ফাই

    inotifywait -q -e বন্ধ / সিস / শ্রেণি / ড্রাম / কার্ড0-ডিপি-2 / স্থিতি / দেব / নাল
সম্পন্ন

এটি আপনার .xsessionrc থেকে সর্বোত্তমভাবে অনুরোধ করা হয়েছে, সমাপ্তি & টি ভুলে যাবেন না। এক্সরেন্ডারের সাথে পোলিং আমার ব্র্যান্ডের নতুন ল্যাপটপে গুরুতর ব্যবহারযোগ্যতার সমস্যা দিয়েছে (মাউস পর্যায়ক্রমে স্টল হবে)।


আমি ভেবেছিলাম হতো না যে আপনার inotify ব্যবহার করতে পারেন /procএবং মাত্র করছেন inotifywait -q -e close /sys/class/drm/card0-DP-2/status প্রকৃতপক্ষে আমার সিস্টেমে ডিপি-2 সংযোগ বিচ্ছিন্ন করার উপর শেষ হয়নি
nhed

3

আমি srandrd ব্যবহার আটকে । এটি এক্স ইভেন্টগুলি পর্যবেক্ষণ করে এবং কোনও স্ক্রিপ্ট সংযোগ বিচ্ছিন্ন হয়ে গেলে আপনার স্ক্রিপ্টটিকে ট্রিগার করে।


0

অবশ্যই কিছু থাকতে হবে! :) / সিস ফাইল সিস্টেমটি হার্ডওয়্যারটি যা উপলভ্য তা ইউজারস্পেসকে বলে, সুতরাং ইউজারস্পেস সরঞ্জামগুলি (যেমন উদেব বা এমডেভ) বর্তমানে উপলব্ধ হার্ডওয়্যারকে উপস্থাপনকারী ডিভাইস নোডের সাথে একটি "/ dev" ডিরেক্টরিটি গতিশীলভাবে পপুলেট করতে পারে। লিনাক্স দুটি হটপ্লাগ ইন্টারফেস সরবরাহ করে: / এসবিন / হটপ্লাগ এবং নেটলিঙ্ক।

নিম্নলিখিত ফাইলে একটি ছোট সি ডেমো রয়েছে। http://www.kernel.org/doc/pending/hotplug.txt


0

লিনাক্সের বেশিরভাগ সিস্টেম / অ্যাপ্লিকেশন সফ্টওয়্যার একে অপরের সাথে যোগাযোগের জন্য কিছু আইপিসি কৌশল ব্যবহার করেছে। ডি-বাস এখন বেশিরভাগই জিনোম অ্যাপ্লিকেশনগুলির সাথে ব্যবহৃত হয় এবং এটি সাহায্য করতে পারে।

লিনাক্স জার্নাল:

D-BUS সিস্টেমের মাধ্যমে ইভেন্টগুলি বা সিগন্যালগুলি প্রেরণের সুবিধার্থে সিস্টেমের বিভিন্ন উপাদানকে যোগাযোগের অনুমতি দেয় এবং শেষ পর্যন্ত আরও ভাল সংহত করতে পারে। উদাহরণস্বরূপ, একটি ব্লুটুথ ডমন একটি ইনকামিং কল সিগন্যাল প্রেরণ করতে পারে যা আপনার সঙ্গীত প্লেয়ার কলটি শেষ না হওয়া অবধি ভলিউমকে নিঃশব্দ করে দিতে পারে।

প্রধান উইকি:

ডি-বাস উভয়ই সিস্টেম ডিমন সরবরাহ করে ("নতুন হার্ডওয়্যার ডিভাইস যুক্ত" বা "প্রিন্টারের সারি পরিবর্তিত" এর মতো ইভেন্টের জন্য) এবং প্রতি ব্যবহারকারী-লগইন-সেশন ডিমন (ব্যবহারকারী অ্যাপ্লিকেশনগুলির মধ্যে সাধারণ আন্ত-প্রক্রিয়া যোগাযোগের প্রয়োজনের জন্য)

এমনকি এর জন্য একটি পাইথন গ্রন্থাগারও রয়েছে এবং উবুন্টু সম্প্রতি এই ক্ষমতা ব্যবহার করেছে যার নাম " জিটজিস্ট "।


-6

গ্রাফিকভাবে আপনি মনিটরটি স্বীকৃত কিনা তা দেখতে পাচ্ছেন Monitor, আমি জানি যে আপনি এটি উবুন্টু, ফেডোরা এবং অন্যদের (বা অনুরূপ) কোনও স্থানে খুঁজে পেতে পারেন।

সিস্টেম / পছন্দসমূহ / মনিটর

এবং আপনি যে কোনও মনিটর চান তা চালু / বন্ধ করতে পারেন বা মনিটর বা স্বতন্ত্র মনিটরের উভয় ক্ষেত্রেই সদৃশ চিত্র সহ একই সাথে উভয় ব্যবহার করতে পারেন


2
তিনি একটি ইভেন্টের জন্য জিজ্ঞাসা করেছিলেন যা মনিটরের প্লাগ / প্লাগ
লাগানো

তুমি কি এখানে দেখেছ? stackoverflow.com/questions/5469828/…
সতীশ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.