Чому inotifywatch не виявляє змін у доданих файлах?


14

Я намагаюся контролювати /tmpзміни моєї папки за допомогою inotifywatch:

sudo inotifywatch -v -r /tmp

Після створення декількох файлів ( touch /tmp/test-1 /tmp/test-2) я закінчую inotifywatch(by 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, і щось було обмежено?

ОС: Debian 7.3 (inotify-tools) на VPS

Відповіді:


14

Це пов’язано з способом, який ви використовуєте inotifywatch, і з тим, як працює сам інструмент. Запустивши inotifywatch -r /tmp, ви починаєте дивитися /tmpта всі файли, які вже є в ньому. Коли ви створюєте файл всередині /tmp, метадані каталогів оновлюються, щоб вони містили номер inode нового файлу, що означає, що зміна відбувається /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: [...] Якщо нові каталоги будуть створені в каталогів, що спостерігаються, вони автоматично переглядаються.

Edit: я трохи заплутався між вашими двома прикладами, але в першому випадку , годинник правильно розміщені , так як виклики користувача inotifywatchна ~/*(який розкладається, см коментар don_crissti тут ). Домашній каталог також переглядається, оскільки ~/.*містить ~/.. Теоретично він також повинен містити ~/.., що в поєднанні з -rкомутатором має спричинити перегляд всієї системи.

Тим НЕ менше, це можливо , щоб отримати ім'я файлу , що запускає створити подію в спостережуваному каталозі, але я припускаю , inotifywatchне одержати цю інформацію (він зберігається трохи глибше , ніж ім'я каталогу). inotify-toolsнадає ще один інструмент, який називається inotifywait, який може вести себе подібним чином inotify-watch, і надає більше варіантів виводу (в тому числі %f, саме те, що ви шукаєте тут):

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

Від людини сторінці :

--format <fmt>Виведіть у визначеному користувачем форматі, використовуючи синтаксис, схожий на printf. [...] Підтримуються такі конверсії:

%f: коли подія відбувається в каталозі, це буде замінено на ім'я файлу, який спричинив подію .

%e: замінено на події, що відбулися, розділені комами.

Крім того, -mопція (монітор) буде продовжувати inotifywaitпрацювати після першої події, що відтворить поведінку, досить схожу на inotifywatch's.


1
.bashrcу прикладі @ serverfaultне відображається у статистиці, оскільки користувач ревізує домашній каталог рекурсивно, а тому, що path/.*він розширений, і в результаті встановлюється перегляд усіх файлів у. path/( .bashrcвключено). Команда, що використовується ОП, ніколи не виводить імена файлів, тому що годинник встановлений для /tmpбудь-яких підкаталогів, тому статистика стосуватиметься лише /tmpта підкаталогів (тобто ви побачите, до яких файлів було доступно / переміщено / тощо, але воно не скаже вам їх назви).
don_crissti

@don_crissti На жаль, я змішав два приклади, подані ОП. Я відредагував свою відповідь, дякую!
Джон У. Сміт

Дякую, це було корисно. Ось моя команда , щоб показати вміст всіх новостворених тест * файли в /tmp: inotifywait -m --format "%f" /tmp | grep --line-buffered ^test | xargs -L1 -I% sudo cat /tmp/% 2> /dev/null.
kenorb

Також: " Це означає, що будь-яка подія, яка відбудеться у файлі, створеному після розміщення годин, не буде виявлена. Будь-яка подія (навіть створення файлу) буде виявлена, тому що годинник ВИНАГО встановлений для каталогу, що містить, і це відображена в статистиці цього конкретного каталогу. Дивіться 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>> ... До переглянутого файлу чи файлу в переглянутому каталозі було доступно / закрито / відкрито / тощо (означає, включаючи події, "які відбуваються у файлі" ). Події для файлу, створеного після встановлення годинника на батьківський dir, будуть виявлені та відображені в inotifywatchстатистиці (він НЕ буде згадувати, для яких файлів відбулися ці події).
don_crissti
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.