के तहत एक फ़ाइल में परिवर्तन की सूचना / खरीद


13

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

मैं जिस चीज की तलाश कर रहा हूं /proc/asound/card0/codec#0, वह फाइल पर परिवर्तनों की सूचना प्राप्त करने का कुछ तरीका है , ठीक उसी तरह जैसे inotifywaitकि असली फाइलों पर (फाइलों को अंडर / सेल में "छद्म फाइलों" के रूप में माना जाता है)।

मैं अपने कोड थोड़ा पागल है क्योंकि यह चलाता है मिल जाए, sleep 1साथ awkपूरा दिन, कि 86400 बार एक दिन है के लिए :)

while sleep 1; do
    _1=${_2:-}
    _2=$(awk '/Pin-ctls/{n++;if(n==4)print}' '/proc/asound/card0/codec#0')

    [[ ${_1:-} = $_2 ]] ||
        if [[ $_2 =~ OUT ]]; then
            use_speakers
        else
            use_internal
        fi
done

मैं जिस चीज की तलाश कर रहा हूं वह कुछ इस तरह है (यह उदाहरण काम नहीं करता है):

codec=/proc/asound/card0/codec#0
while inotifywait $codec; do
    if [[ $(awk '/Pin-ctls/{n++;if(n==4)print}' $codec) =~ OUT ]]; then
        use_speakers
    else
        use_internal
    fi
done

इस तरह लूप के अंदर की कमांड तभी चलाई जाएगी जब $codecफाइल में असली बदलाव होंगे ।


1
यह पागल नहीं है - जैसे topऔर जीयूआई सिस्टम मॉनिटर /procछोटे अंतराल से एक पूरी बहुत अधिक पढ़ते हैं। बेशक, वे इसे संकलित निष्पादन योग्य के रूप में अधिक कुशलता से करते हैं, लेकिन मुद्दा यह है: सूचना के लिए मतदान एक सामान्य कार्य है।
गोल्डीलॉक्स

2
चूंकि अंतर्निहित समस्या आपके लिए अद्वितीय नहीं है, इसलिए मैं उम्मीद करूंगा कि कुछ तैयार समाधान (कम से कम कुछ हार्डवेयर के लिए) हो - unix.stackexchange.com/questions/25776/… और superuser.com/estestions पर एक नज़र डालें / 339900 /… । अंतिम स्रोत निश्चित रूप से कर्नेल ट्री है (और यदि आप इसे किसी ड्राइवर में लागू करने का निर्णय लेते हैं तो हार्डवेयर स्पेक्स)।
पीटरफ

1
यदि यह पता चलता है /proc, तो आप शायद एक udev नियम के साथ अपनी स्क्रिप्ट को ट्रिगर कर सकते हैं , जो बहुत ही आदर्श होगा। कम आदर्श यह है कि यह
udv

@peterph मैं जो इकट्ठा कर सकता था, hda-verb पैरामीटर सेट करने या जांचने के लिए एक इंटरफ़ेस प्रदान करता है, लेकिन ऐसा लगता है कि मुझे इसे हर सेकंड और साथ ही चलाना होगा।
टेरेसा ई जूनियर

@goldilocks हेडफ़ोन प्लग करना किसी भी udv- ईवेंट को नहीं भेजता है। या कुछ और है जो मुझे याद आ रहा है?
टेरेसा ई जूनियर

जवाबों:


10

मैं जिस चीज़ की तलाश कर रहा हूँ, वह फ़ाइल में परिवर्तन की सूचना प्राप्त करने का कुछ तरीका है [proc में]

आप नहीं कर सकते, क्योंकि वे फाइलें नहीं हैं। यह काफी डुप्लिकेट प्रश्न नहीं है, लेकिन यहाँ उत्तर बताता है कि क्यों।

/procएक कर्नेल इंटरफ़ेस है। वहाँ कोई वास्तविक फ़ाइलें नहीं हैं, इसलिए वे बदल नहीं सकते हैं। हैंडल से पढ़ना एक अनुरोध और फ़ाइल में डेटा है जब आप पढ़ते हैं तो यह उसी का उत्तर है।

जिस तरह से आप कुछ इस तरह से अनुकरण कर सकते हैं, वह होगा अंतराल पर फ़ाइल को पढ़ना और सामग्री की तुलना करके यह देखना कि क्या कर्नेल से उत्तर बदल गया है - ऐसा लगता है कि आपने पहले ही ऐसा कर लिया है।

यदि आप statफ़ाइलों की खरीद करते हैं, तो atime और mtime समान होगा: कुछ फ़ाइलों के लिए यह तब होता है जब भी स्टेट कॉल होती है, दूसरों के लिए सिस्टम बूट के दौरान से। पहले मामले में, यह हमेशा बदला हुआ प्रतीत होगा, दूसरे में, यह कभी नहीं बदला होगा।


दुर्भाग्य से, यहां तक ​​कि इसे हर सेकंड मतदान करने से काफी विलंबता (जैसे। 500ms) जुड़ती है। मुझे उम्मीद है कि ऐसा करने का एक तेज़ / अधिक कुशल तरीका होगा, लेकिन जब से आपने उल्लेख किया है कि शीर्ष जैसे ऐप इसे वैसे ही करते हैं, मुझे लगता है कि मैं इसे इस तरह छोड़ दूंगा।
टेरेसा ई जूनियर

@TeresaeJunior यदि विलंबता एक मुद्दा है (मुझे लगता है कि यह यहां नहीं है), उदाहरण के लिए, क्योंकि पोल की अवधि का उपयोग गणना में किया जाता है, तो आप वास्तविक अवधि (और केवल उस समय का उपयोग नहीं करेंगे, जो आपने सोने के लिए कहा था) । हालांकि यह बहुत पसंद है; मैंने कभी भी bash script को profiled नहीं किया इसलिए मुझे नहीं पता कि यहाँ क्या सामान्य होगा (हम्म ... अच्छा अलग सवाल)। Awk == fork()और उस जैसे सामान को महंगा करना; उपयोगिताओं में सी लिखा है, जैसा कि उल्लेख किया गया है, तेज तरीके होंगे। मुझे अभी भी नहीं लगता है कि आप कुल मिलाकर सिस्टम में अधिक लोड जोड़ रहे हैं।
गोल्डीलॉक्स 14'13

1
नहीं, क्षमा करें, मेरा वास्तव में मतलब था: जब से मैं अगली नींद तक हेडफ़ोन प्लग करता हूं, कुछ ध्यान देने योग्य देरी है। लेकिन मैं नींद के समय को कम करने की योजना नहीं बनाता। आपकी सहायताके लिए धन्यवाद!
टेरेसा ई जूनियर

4

यदि आप PulseAudio का उपयोग कर रहे हैं, pactl subscribeतो यह करता है।


हाँ सचमुच! मैंने कुछ ऑडियो समस्याओं के कारण कुछ महीने पहले पीए 4.0 को संकलित करने के बाद इसका उपयोग करना शुरू कर दिया। डेबियन स्टेबल पर संस्करण 2.0 है (हालांकि उन्होंने हाल ही में 4.0 को बैकपोर्ट पर अपलोड किया है), और subscribe2.0 पर कोई भी नहीं था ।
टेरेसा ई जूनियर

2

यह भी ध्यान रखें कि /proc/मतदान के माध्यम से परिवर्तनों के लिए निगरानी के लिए परमिट के तहत कुछ फाइलें , उदाहरण के लिए यदि आप करते man procहैं तो आप निम्नलिखित /proc/self/mountsफाइल के बारे में पढ़ सकते हैं :

/ proc / [pid] / mounts (लिनक्स 2.4.19 के बाद से) यह फ़ाइल वर्तमान में प्रक्रिया के माउंट नेमस्पेस (माउंट_नमस्पेस (7) देखें) में मौजूद सभी फाइल सिस्टम को सूचीबद्ध करती है। इस फ़ाइल का प्रारूप fstab (5) में प्रलेखित है।

चूंकि कर्नेल संस्करण 2.6.15, यह फ़ाइल प्रदूषित है: फ़ाइल को पढ़ने के लिए खोलने के बाद, इस फ़ाइल में एक बदलाव (यानी, एक फाइलसिस्टम माउंट या अनमाउंट) का कारण बनता है (2) फ़ाइल डिस्क्रिप्टर को एक असाधारण स्थिति होने के रूप में चिह्नित करने के लिए चयन करें (2) पोल (2) और epoll_wait (2) प्राथमिकता वाली घटना (POLLPRI) के रूप में फ़ाइल को चिह्नित करें। (लिनक्स 2.6.30 से पहले, इस फाइल में बदलाव को फाइल डिस्क्रिप्टर द्वारा चयन के लिए पठनीय (2) के रूप में चिह्नित किया जा रहा था, और पोल (2) और epoll_wait (2) के लिए एक त्रुटि स्थिति होने के रूप में चिह्नित किया गया था।

और यह वास्तव में निम्नलिखित प्रश्न में लागू किया जा रहा है:

/programming/5070801/monitoring-mount-point-changes-via-proc-mounts


-1

परिवर्तित फ़ाइलों की netlinkनिगरानी के लिए उपयोग करने का प्रयास करें /proc

https://mdlayher.com/blog/linux-netlink-and-go-part-1-netlink/


साइट पर आपका स्वागत है। कृपया उस कार्य को प्राप्त करने के लिए उपयोग करने के बारे में कुछ स्पष्टीकरण जोड़ें netlink; यह आपके द्वारा लिंक की गई बाहरी सामग्री से स्पष्ट नहीं है। इसके अलावा, यह सामान्य रूप से पसंद है कि "लिंक-ओनली" उत्तर न हो क्योंकि बाहरी सामग्री बदल सकती है या निकाली जा सकती है (अपने मूल रूप से लिंक किए गए पृष्ठ के शीर्ष पर नोटिस देखें, जैसे), जो आपके योगदान की उपयोगिता को कम करेगा।
AdminBee
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.