কেন inotifwatch যুক্ত করা ফাইলগুলিতে পরিবর্তনগুলি সনাক্ত করতে পারে না?


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ইত্যাদি), কিন্তু সেই একই জিনিস।

আমি কি কিছু রেখে গেলাম? এটি কারণ আমি ভিপিএসে আছি এবং কিছু সীমাবদ্ধ করা হয়েছে?

ওএস: ভিপিএসে ডেবিয়ান 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করে ~/*(যা প্রসারিত, ডন_ক্রিসটির মন্তব্য দেখুন এখানে )। হোম ডিরেক্টরি এছাড়াও দেখা হয় কারণ ~/.*রয়েছে ~/.। তাত্ত্বিকভাবে, এটিতেও এটি থাকা উচিত ~/.., যা -rস্যুইচটির সাথে মিলিত হয়ে পুরো সিস্টেমটি দেখার ফলে দেখা উচিত।

তবে, একটি পর্যবেক্ষিত ডিরেক্টরিতে একটি ইভেন্ট তৈরির সূত্রপাতকারী ফাইলটির নাম পাওয়া সম্ভব , তবুও আমি অনুমান করছি যে এই তথ্যটি পুনরুদ্ধার করবে না (এটি ডিরেক্টরিটির নামের চেয়ে কিছুটা গভীরভাবে সংরক্ষিত হয়েছে)। বলা হয় এমন একটি আর একটি সরঞ্জাম সরবরাহ করে , যা বেশ ভালো আচরণ করতে পারে এবং আরও আউটপুট বিকল্প সরবরাহ করে (সহ আপনি এখানে যা খুঁজছেন তা সহ :)inotifywatchinotify-toolsinotifywaitinotify-watch%f

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

থেকে man পৃষ্ঠা :

--format <fmt>প্রিন্টফ-এর মতো সিনট্যাক্স ব্যবহার করে কোনও ব্যবহারকারী-নির্দিষ্ট ফর্ম্যাটে আউটপুট। [...] নিম্নলিখিত রূপান্তরগুলি সমর্থিত:

%f: যখন কোনও ডিরেক্টরি ডিরেক্টরিতে ঘটে তখন ফাইলটির নামের সাথে এটি প্রতিস্থাপন করা হবে যা ইভেন্টটি ঘটায়

%e: ঘটেছে ইভেন্ট (গুলি) এর সাথে প্রতিস্থাপন, কমা দ্বারা পৃথক।

এছাড়াও, -mবিকল্প (মনিটর) inotifywaitপ্রথম ইভেন্টের পরে চলতে থাকবে, যা এর আচরণের মতোই পুনরুত্পাদন করবে inotifywatch


1
.bashrcউদাহরণস্বরূপ @ serverfaultপরিসংখ্যানগুলিতে উপস্থিত হয় না কারণ ব্যবহারকারী তার হোম ডিরেক্টরিটি পুনরাবৃত্তভাবে পর্যবেক্ষণ করে তবে path/.*প্রসারিত হয় এবং ফলস্বরূপ 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
কেনোরব

এছাড়াও: "এর অর্থ হ'ল ঘড়ির স্থান রাখার পরে তৈরি হওয়া কোনও ফাইলের মধ্যে ঘটে যাওয়া কোনও ঘটনা সনাক্ত করা যাবেনা event" কোনও ইভেন্ট (এমনকি ফাইল তৈরি করা) সনাক্ত করা যাবে কারণ একটি ঘড়ি অন্তর্ভুক্ত ডিরেক্টরিটির জন্য প্রস্তুত রয়েছে এবং এটি হ'ল নির্দিষ্ট ডিরেক্টরি জন্য পরিসংখ্যান প্রতিফলিত। inotifywatchওপি প্রশ্নের আউটপুট দেখুন : 2 টি createইভেন্ট রয়েছে (তাই তারা সনাক্ত করা হয়) তবে যেহেতু inotifywatchএকটি ডিরেক্টরি (+ কোনও সাব-ডিরেক্টরি) দেখেন সেগুলি পরিসংখ্যান কেবলমাত্র সেই / সেই ডিরেক্টরিগুলির সাথে সম্পর্কিত।
don_crissti

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... একটি দেখা ফাইল বা একটি দেখা ডিরেক্টরিতে থাকা ফাইলের মধ্যে একটি ফাইল অ্যাক্সেস / বন্ধ / খোলা / ইত্যাদি (অর্থ "ফাইলগুলিতে ঘটে যাওয়া ইভেন্টগুলি সহ ) " পিতামহীন ডিয়ারের উপরে নজর রাখার পরে তৈরি করা কোনও ফাইলের ইভেন্টগুলি সনাক্ত করা হবে এবং inotifywatchপরিসংখ্যানগুলিতে প্রতিফলিত হবে (কোন ফাইলগুলির জন্য এই ঘটনাগুলি ঘটেছে তা উল্লেখ করা হবে না)।
don_crissti
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.