Вы не можете заставить ядро сообщать вам только об изменении определенного пути. Причины немного тонкие:
В Linux объект файла существует независимо от любого имени (имен), которое он может иметь. Имена файлов на самом деле являются атрибутами их содержащего каталога, и один файл может вызываться несколькими именами (см. Жесткую привязку).
В ядре должно быть что-то, к чему можно прикрепить объекты inotify; он не может прикрепить объект к имени пути, поскольку имя пути не является реальным объектом файловой системы; вы должны присоединиться к родительскому каталогу или файлу, который описывает путь. Но вы не можете прикрепить к файлу, потому что вы смотрите, чтобы увидеть, создается ли файл с заданным именем, а не изменяется данный файл.
Теоретически ядро могло бы реализовать API, который позволяет вам выбирать события для заданного пути при добавлении часов в каталог, почти так же, как он позволяет вам выбирать типы событий. Это приведет к раздуванию API, и ядро, в конце концов, будет обрабатывать те же данные и выполнять то же сравнение строк, что и в пользовательском пространстве.
Есть ли заметное снижение производительности при установке часов в очень активном каталоге? Я не уверен, насколько вы активны; десятки файлов в секунду, сотни, миллионы?
В любом случае, я бы избегал доступа
: он всегда будет гоночным. Файл может быть создан и удален между вызовами access
, и вызов access
в очень плотном цикле будет медленным, и это проблема inotify
] был разработан для решения.
Я применил этот подход, когда мне нужно было отслеживать записи внутри контейнера докеров:
LOG_COUNT=0
LOGS=/var/logs/your_logs
function HEART_BEAT() {
LOG_COUNT_NEW=$(wc -l $LOGS | awk '{ print $1 }')
tail -n $(( $LOG_COUNT_NEW - $LOG_COUNT )) $LOGS
LOG_COUNT=$LOG_COUNT_NEW
}
Надеюсь, это поможет!