Иногда нужно выполнить действие сразу после изменения файла или каталога. Например:
• изменился конфиг - перезапустить сервис
• появился новый файл - обработать его
• загрузили архив - распаковать
• изменился сертификат - перечитать nginx
• в каталог упал лог - отправить уведомление
Первое решение, которое часто приходит в голову - cron. Но cron работает по расписанию. Он не реагирует на событие сразу, а просто периодически проверяет состояние. Для событий в файловой системе удобнее использовать
inotifywait.▪️ Установка:
apt install inotify-tools
▪️ Посмотреть изменения файла:
inotifywait -m /etc/nginx/nginx.conf
Ключ
-m включает постоянное наблюдение.Пример вывода:
/etc/nginx/nginx.conf MODIFY
▪️ Следить за каталогом:
inotifywait -m /var/www
Рекурсивно:
inotifywait -m -r /var/www
Можно выбрать конкретные события:
inotifywait -m -e create,modify,delete /var/www
▪️ Простой пример: перезагрузить nginx после изменения конфига.
while inotifywait -e modify /etc/nginx/nginx.conf; do
nginx -t && systemctl reload nginx
done
Смысл простой:
• ждем изменение файла
• проверяем конфиг
• если всё нормально - reload nginx
• снова ждем следующее изменение
▪️ Еще пример: обработать новые файлы в каталоге.
inotifywait -m -e close_write --format '%w%f' /data/incoming |
while read -r file; do
echo "new file: $file"
/opt/scripts/process-file.sh "$file"
done
Почему close_write, а не просто create? Потому что файл может появиться, но запись в него еще не закончилась. close_write срабатывает, когда файл уже записан и закрыт.
⚠️ inotifywait - не замена очередям, брокерам сообщений и нормальной event-driven архитектуре. У него есть лимиты ядра, события можно потерять при перегрузке, а рекурсивное наблюдение за огромными деревьями может быть тяжелым. Проверить лимиты можно так:
sysctl fs.inotify.max_user_watches
sysctl fs.inotify.max_user_instances
#linux #inotify
🧑💻 NetworkAdmin