Как отслеживать полное дерево каталогов на предмет изменений в Linux?
Как я могу контролировать полное дерево каталогов для изменений в Linux (файловая система ext3)?
В настоящее время каталог содержит около полумиллиона файлов в 3000 подкаталогах, организованных на трех уровнях каталогов.
В основном это небольшие файлы (< 1kb, некоторые - до 100 kb). Это своего рода очередь, и мне нужно знать, когда файлы создаются, удаляются или их содержимое изменяется в течение 5-10 секунд после этого.
Я знаю, что есть inotify и sorts, но AFAIK они контролируют только один каталог, что означает, что мне понадобится 3000 дескрипторов inotify в моем случае - больше, чем обычные 1024 дескриптора, разрешенные для одного процесса. Или я не прав?
Если система Linux не может мне сказать, что мне нужно: возможно, существует проект FUSE, который имитирует файловую систему (реплицируя все обращения к файлам на реальная файловая система) и отдельно регистрирует все изменения (не может быть точной)?
Ответы
Ответ 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>>