Подтвердить что ты не робот

Как отслеживать полное дерево каталогов на предмет изменений в Linux?

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Я сделал что-то подобное с помощью инструмента 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, чтобы поместить его в режим мониторинга.

Ответ 3

$ inotifywait -m -r /path/to/your/directory

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

Ответ 4

Не было ли фантотизация предполагать, что в конечном итоге это даст? Цитирование LWN:

"fanotify имеет два основных" режима ", направленные и глобальные. [...] fanotify global вместо указывает что он хочет все в системе, а затем индивидуально отмечает inodes, что он не заботится. "

Я потерял информацию о том, каким был его последний статус.

Ответ 5

Используйте inotifywait от inotify-tools:

sudo apt install inotify-tools

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

#!/bin/bash
while true; do

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

done

Сделайте скрипт исполняемым с помощью 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

Ответ 6

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

watch -d find <<path>>