जोड़ा फ़ाइलों पर परिवर्तन का पता लगाने के लिए टॉटिफ़वाच क्यों नहीं होता है?


14

मैं /tmpउपयोग करके परिवर्तनों के लिए अपने फ़ोल्डर की निगरानी करने का प्रयास कर रहा हूं inotifywatch:

sudo inotifywatch -v -r /tmp

कुछ फ़ाइलों को बनाने के बाद ( touch /tmp/test-1 /tmp/test-2), मैं समाप्त कर रहा हूँ inotifywatch(द्वारा Ctrl- Cजो मुझे निम्नलिखित आँकड़े दिखाता है:

Establishing watches...
Setting up watch(es) on /tmp
OK, /tmp is now being watched.
Total of 39 watches.
Finished establishing watches, now collecting statistics.
total  attrib  close_write  open  create  filename
8      2       2            2     2       /tmp/

आउटपुट केवल आंकड़ों को प्रिंट करता है, लेकिन उन फ़ाइलों को नहीं जो मुझे उम्मीद थी (जैसा कि यहां या यहां है )। मैं का उपयोग (के माध्यम से अलग-अलग प्रकार की कोशिश की cat, mktemp, आदि), लेकिन यह एक ही बात है।

क्या मैं कुछ भुल गया? ऐसा इसलिए है क्योंकि मैं VPS पर हूं और कुछ प्रतिबंधित है?

ओएस: वीपीएस पर डेबियन 7.3 (इनोटिफ़ाइ-टूल्स)

जवाबों:


14

यह आपके द्वारा उपयोग किए जा रहे तरीके के कारण है inotifywatch, और जिस तरह से उपकरण स्वयं काम करता है। जब आप दौड़ते हैं inotifywatch -r /tmp, तो आप देखना शुरू करते हैं /tmpऔर सभी फाइलें जो पहले से ही इसमें हैं। जब आप एक फ़ाइल बनाते हैं /tmp, तो निर्देशिका मेटाडेटा को नई फ़ाइल के इनोड नंबर को अपडेट करने के लिए अपडेट किया जाता है, जिसका अर्थ है कि परिवर्तन पर होता है /tmp, नहीं /tmp/test-1। इसके अतिरिक्त, जब से /tmp/test-1वहाँ inotifywatchशुरू किया गया था , वहाँ कोई inotifyघड़ी नहीं है। इसका मतलब है कि घड़ियां लगाए जाने के बाद बनाई गई किसी भी घटना का पता नहीं लगाया जाएगा । यदि आप इसे स्वयं देखते हैं तो आप इसे बेहतर समझ सकते हैं:

$ inotifywatch -rv /tmp &
Total of n watches.
$ cat /sys/kernel/debug/tracing/trace | grep inotifywatch | wc -l
n

यदि आपने ट्रेसिंग तंत्रinotify_add_watch(2) को सक्षम किया है , तो अंतिम कमांड आपको सेट की गई घड़ियों की संख्या देगा inotifywatch। यह संख्या inotifywatchस्वयं के द्वारा दी गई होनी चाहिए । अब, अंदर एक फ़ाइल बनाएँ /tmpऔर फिर से जाँच करें:

$ inotifywatch -rv /tmp &
Total of n watches.
$ touch /tmp/test1.txt
$ cat /sys/kernel/debug/tracing/trace | grep inotifywatch | wc -l
n

संख्या में वृद्धि नहीं हुई होगी, जिसका अर्थ है कि नई फ़ाइल नहीं देखी गई है। ध्यान दें कि यदि आप एक निर्देशिका बनाते हैं तो व्यवहार भिन्न है:

$ inotifywatch -rv /tmp &
Total of n watches.
$ mkdir /tmp/test1
$ cat /sys/kernel/debug/tracing/trace | grep inotifywatch | wc -l
n + 1

यह -rस्विच के व्यवहार के तरीके के कारण है :

-r, --recursive: [...] नई निर्देशिका देखा निर्देशिका के भीतर बनाई गई हैं, तो वे अपने आप को देख चुके हो जाएगा।

संपादित करें: मैं आपके दो उदाहरणों के बीच थोड़ा भ्रमित हो गया, लेकिन पहले मामले में , घड़ियों को सही ढंग से रखा गया है क्योंकि उपयोगकर्ता कॉल inotifywatchकरता है ~/*(जो विस्तारित है, यहां don_crissti की टिप्पणी देखें )। होम डायरेक्टरी को भी देखा जाता है क्योंकि ~/.*इसमें शामिल है ~/.। सैद्धांतिक रूप से, इसमें वह भी होना चाहिए ~/.., जो -rस्विच के साथ मिलकर , पूरे सिस्टम को देखने में परिणत होना चाहिए।

हालांकि, यह है फ़ाइल ट्रिगर एक का नाम पाने के लिए संभव बनाने के एक देखा निर्देशिका में घटना, अभी तक मेरा अनुमान है कि inotifywatch(यह निर्देशिका नाम की तुलना में गहरी एक छोटे से सहेजा जाता है) इस जानकारी को पुनः प्राप्त नहीं करता है। inotify-toolsएक और उपकरण प्रदान करता है, जिसे कहा जाता है inotifywait, जो बहुत अधिक व्यवहार कर सकता है inotify-watch, और अधिक आउटपुट विकल्प प्रदान करता है (सहित %f, वह है जो आप यहां देख रहे हैं):

inotifywait -m --format "%e %f" /tmp

से आदमी पेज :

--format <fmt>प्रिंटफ जैसे सिंटैक्स का उपयोग करके एक उपयोगकर्ता-निर्दिष्ट प्रारूप में आउटपुट। [...] निम्नलिखित रूपांतरण समर्थित हैं:

%f: जब कोई ईवेंट निर्देशिका के भीतर होता है, तो इसे उस फ़ाइल के नाम से बदल दिया जाएगा, जिसके कारण ईवेंट हुआ

%e: ईवेंट के साथ प्रतिस्थापित किया गया, जो अल्पविराम से अलग हुआ।

इसके अलावा, -mविकल्प (मॉनिटर) inotifywaitपहली घटना के बाद चालू रहेगा, जो एक व्यवहार को काफी हद तक समान करेगा inotifywatch


1
.bashrcउदाहरण में @ serverfaultआँकड़ों में प्रकट नहीं होता है क्योंकि उपयोगकर्ता अपने होम डायरेक्टरी को पुनरावर्ती रूप से मॉनिटर करता है, क्योंकि path/.*विस्तारित किया जाता है और परिणामस्वरूप सभी .files के तहत path/( .bashrcशामिल) के लिए एक घड़ी सेट की जाती है । ओपी द्वारा उपयोग की जाने वाली कमांड कभी भी फ़ाइल नाम का उत्पादन नहीं करेगी क्योंकि घड़ियां /tmpकिसी भी उपनिर्देशिका के लिए निर्धारित हैं और इसलिए आँकड़े केवल /tmpऔर इसके उपनिर्देशिका से संबंधित होंगे (अर्थात आप देखेंगे कि फाइलें एक्सेस / स्थानांतरित / आदि हो गई हैं, लेकिन यह आपको उनके बारे में नहीं बताएगा) नाम नहीं)।
दान_क्रांति

@don_crissti उफ़, मैंने ओपी द्वारा दिए गए दो उदाहरणों को मिलाया। मैंने अपना उत्तर संपादित किया, धन्यवाद!
जॉन डब्ल्यूएच स्मिथ

धन्यवाद, यह उपयोगी था। यहाँ सभी नए बनाए गए परीक्षण की सामग्री को दिखाने की मेरी कमान है /tmp: * inotifywait -m --format "%f" /tmp | grep --line-buffered ^test | xargs -L1 -I% sudo cat /tmp/% 2> /dev/null
केनोरब

इसके अलावा: " इसका अर्थ है कि घड़ियों को रखने के बाद बनाई गई फ़ाइल पर होने वाली किसी भी घटना का पता नहीं लगाया जाएगा। " किसी भी घटना (यहां तक ​​कि फ़ाइल निर्माण) का पता लगाया जाएगा, क्योंकि एक घड़ी ALREADY युक्त निर्देशिका के लिए सेट है और यह है उस विशेष निर्देशिका के आंकड़ों में परिलक्षित होता है। inotifywatchओपी प्रश्न में आउटपुट देखें : 2 createघटनाएं हैं (इसलिए उनका पता लगाया जाता है) लेकिन चूंकि inotifywatchएक निर्देशिका (+ कोई उपनिर्देशिका) देखता है, आँकड़े केवल उन / उन निर्देशिकाओं से संबंधित होते हैं।
डॉन_क्रांति

1
मुझे नहीं लगता कि हम यहां समान तरंग दैर्ध्य पर हैं ... man inotify: When a directory is monitored, inotify will return events for the directory itself, and for files inside the directory.इसके अलावा, man inotifywatchइस बारे में स्पष्ट है कि कौन सी घटनाओं को देखा जा रहा है: EVENTS>> ... एक देखी गई फ़ाइल या एक देखी गई निर्देशिका के भीतर एक फ़ाइल एक्सेस / बंद / खुली थी / आदि (घटनाओं सहित "जो एक फ़ाइल पर होती है" )। पैरेंट dir पर वॉच सेट करने के बाद बनाई गई किसी फ़ाइल के लिए ईवेंट्स को inotifywatchआँकड़ों में पहचाना और परिलक्षित किया जाएगा (यह उन घटनाओं के लिए उल्लेख नहीं किया जाएगा जो उन घटनाओं को दर्ज करती हैं)।
दान_क्रांति
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.