Как отслеживать полное дерево каталогов на предмет изменений в Linux? - PullRequest
49 голосов
/ 02 января 2012

Как я могу отслеживать все дерево каталогов на наличие изменений в Linux ( ext3 файловая система)?

В настоящее время каталог содержит около полмиллиона файлов в 3000 подкаталогах , организованных на трех уровнях каталога.

В основном это небольшие файлы (<1 КБ, некоторые - до 100 КБ). Это своего рода очередь, и мне нужно знать, когда файлы создаются, удаляются или их содержимое изменяется в течение 5-10 секунд после этого. </p>

Я знаю, что inotify и сортирует, но AFAIK они контролируют только один каталог, а это значит, что в моем случае мне потребуется 3000 дескрипторов inotify - больше, чем обычные 1024 дескриптора, разрешенные для одного процесса. Или я не прав?

В случае, если система Linux не может сказать мне, что мне нужно: возможно, существует проект FUSE , который имитирует файловую систему (реплицирует все обращения к файлам в реальной файловой системе) и отдельно регистрирует все модификации (не может быть точной)?

Ответы [ 6 ]

53 голосов
/ 01 ноября 2013

Я сделал нечто подобное, используя инструмент inotifywait:

#!/bin/bash
while true; do

inotifywait -e modify,create,delete -r /path/to/your/dir && \
<some command to execute when a file event is recorded>

done

Это установит рекурсивный просмотр каталогов по всему дереву и позволит вам выполнить команду, когда что-то изменится. Если вы просто хотите просмотреть изменения, вы можете добавить флаг -m, чтобы перевести его в режим мониторинга.

16 голосов
/ 03 сентября 2015
$ inotifywait -m -r /path/to/your/directory

Этой команды достаточно для рекурсивного просмотра каталога для всех событий, таких как доступ, открытие, создание, удаление ...

13 голосов
/ 02 января 2012

Насколько мне известно, нет другого способа, кроме как рекурсивно установить inotify watch для каждого каталога.

Тем не менее, вы не исчерпаете файловые дескрипторы, потому что inotify не нужно резервироватьfd для просмотра файла или каталога (его предшественник, dnotify, действительно страдал от этого ограничения).inotify использует взамен «дескрипторы часов».

В соответствии с документацией для inotifywatch предел по умолчанию составляет 8192 дескрипторов часов, и вы можете увеличить его, записав новое значение в /proc/sys/fs/inotify/max_user_watches.

3 голосов
/ 01 мая 2018

Использовать inotifywait от inotify-tools:

sudo apt install inotify-tools

Теперь создайте скрипт myscript.sh, который также включает скрытые файлы и папки:

#!/bin/bash
while true; do

inotifywait -e modify,create,delete,move -r $1

done

Makeисполняемый скрипт с chmod +x myscript.sh

Запустите его с ./myscript.sh /folder/to/monitor

Если вы не предоставите аргумент, он будет использовать рабочий каталог по умолчанию.

Кроме того, выможет запустить несколько команд, добавив && \ в конце предыдущей команды, чтобы добавить следующую:

#!/bin/bash
while true; do

inotifywait -e modify,create,delete,move -r $1 && \
echo "event" && \
echo "event 2"

done

Если вы не хотите выполнять какую-либо команду для событий, просто запустите команду непосредственно с-m модификатор, поэтому не закрывается:

inotifywait -e modify,create,delete,move -m -r /path/to/your/dir

3 голосов
/ 02 января 2012

Разве Fanotify не должен был предоставить такую ​​возможность в конце концов?Цитирование LWN :

« fanotify имеет два основных« направленных »режима: глобальный.Вместо этого [...] fanotify global указывает, что ему нужно все в системе, а затем индивидуально помечает иноды, которые ему не нужны.

2 голосов
/ 06 июня 2018

inotify - лучший вариант, когда у вас много подкаталогов, но если нет, я привык использовать эту команду ниже:

watch -d find <<path>>

...