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