एक निर्देशिका की निगरानी के लिए inotify का उपयोग करना लेकिन 100% काम नहीं करना


10

मैंने किसी विशेष निर्देशिका की निगरानी के लिए एक बैश स्क्रिप्ट लिखी है /root/secondfolder/:

#!/bin/sh

while inotifywait -mr -e close_write "/root/secondfolder/"
do
    echo "close_write"
done

जब मैं एक फ़ाइल बनाएं जिसका नाम fourth.txtमें /root/secondfolder/और लिखने सामान इसे करने के लिए, को बचाने और यह करीब है, यह निम्नलिखित आउटपुट:

/root/secondfolder/ CLOSE_WRITE,CLOSE fourth.txt

हालाँकि, यह "क्लोज़_राइट" को इको नहीं करता है। ऐसा क्यों है?

जवाबों:


16

inotifywait -m "मॉनिटर" मोड है : यह कभी भी बाहर नहीं निकलता है। शेल इसे चलाता है और निकास कोड का इंतजार करता है ताकि पता चल सके कि लूप के शरीर को चलाना है, लेकिन यह कभी नहीं आता है।

यदि आप निकालते हैं -m, तो यह काम करेगा:

while inotifywait -r -e close_write "/root/secondfolder/"
do
    echo "close_write"
done

पैदा करता है

Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.
/root/secondfolder/ CLOSE_WRITE,CLOSE bar
close_write
Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.
...

डिफ़ॉल्ट रूप से, inotifywait "पहली घटना होने के बाद बाहर निकलेगा", जो कि आप लूप कंडीशन में चाहते हैं।


इसके बजाय, आप मानक आउटपुट पढ़ना पसंद कर सकते हैं inotifywait:

#!/bin/bash

while read line
do
    echo "close_write: $line"
done < <(inotifywait -mr -e close_write "/tmp/test/")

यह (बैश) स्क्रिप्ट प्रक्रिया प्रतिस्थापन के उपयोग से inotifywaitकमांड के प्रत्येक आउटपुट लाइन $lineको लूप के अंदर चर में पढ़ेगी । यह लूप के आसपास हर बार पुनरावर्ती घड़ियों को स्थापित करने से बचता है, जो महंगा हो सकता है। यदि आप बैश का उपयोग नहीं कर सकते हैं, तो आप कमांड को लूप में बदल सकते हैं inotifywait ... | while read line ...:। inotifywaitइस मोड में प्रत्येक ईवेंट के लिए आउटपुट की एक पंक्ति बनाता है, इसलिए लूप प्रत्येक के लिए एक बार चलता है।


2
लूप में कमांड को काम करना, धन्यवाद!
mib1413456
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.