Inotifywait для больших каталогов

В изменениях inotifywait man указано следующее

-r, --recursive Смотреть все подкаталоги любых каталогов, переданных в качестве аргументов. Часы будут настроены рекурсивно на неограниченную глубину. Символические ссылки не проходятся. Также будут отслеживаться вновь созданные подкаталоги.

Предупреждение. Если вы используете эту опцию во время наблюдения за корневым каталогом большого дерева, установление всех наблюдателей inotify может занять довольно много времени, и в это время события не будут получены. Кроме того, поскольку для каждого подкаталога будет установлено по одному наблюдателю inotify, возможно, будет достигнуто максимальное количество наблюдателей inotify на пользователя. Максимальное значение по умолчанию — 8192; его можно увеличить, написав в /proc/sys/fs/inotify/max_user_watches.

Я понимаю, что это означает, что каждый раз, когда вызывается inotifywait, возникает задержка для больших каталогов. Поэтому постоянный мониторинг большого каталога с помощью функции мониторинга, подобной этой

inotifywait -m /home/user/Documents

более эффективен, чем ручной цикл по каталогу (из примера на справочных страницах)

while inotifywait /home/user/Documents; do
 #Do Something for each file change
done

так как на каждой итерации цикла while вам нужно снова настроить inotifywait. Но с первым вариантом я не могу выполнить на основе возврата. В идеале мне нужна функция обратного вызова, например

inotifywait -m --callback ./callback.sh /home/user/Documents

поэтому callback.sh вызывается каждый раз с возвращаемым значением inotifywait. Как бы я это реализовал?


person puk    schedule 11.11.2011    source источник


Ответы (1)


Вы можете передать это как:

inotifywait -m /my/directory | while read LINE; do ./do_something.sh $LINE; done

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

Вы также можете использовать perl или какой-либо другой язык для прямого использования API, что дает вам массу гибкости.

person dmansfield    schedule 11.11.2011
comment
Я никогда не использовал Perl. Я заметил, что во многих примерах используется C, но я предпочитаю использовать оболочку, когда это возможно. - person puk; 11.11.2011
comment
Всегда есть возможность отфильтровать события с помощью переключателя -e команды и/или с помощью do_something.sh grep $LINE для соответствующих событий. - person Luis E.; 17.09.2013