দ্রষ্টব্য: এটি একটি আই 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
কিছু ডকস