Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Администрирование *NIX систем > Отслеживание изменений в файлах и каталогах


Автор: Imple 11.10.2007, 09:29
Отслеживание изменений в файлах и каталогах

Нередко появляется необходимость выполнить какое-либо действие при изменении произвольноко файла или каталога. Это может быть очень полезно во многих случаях, например:
  •  Автоматическая проверка на вирусы входящих файлов;
  •  Отслеживание изменений корпоративной информации;
  •  Отслеживане изменений логов приложений на "лету";
  •  Автоматический бэкап критической информации при изменении;
  •  Отладка стороннего ПО
Продолжать список можно бесконечно. К примеру, я недавно столкнулся с необходимостью получать из лога програмного PBX информацию о совершенных звонках и помещать их в БД MySQL. Как это сделать? Первое что пришло на ум - раз в n минут проверять файл на наличие изменений, но нашлось более "правильное" решение. 

Inotify - система отслеживания изменений файлов, предоставляемая ядром Linux в замен устаревшей системы dnotify, начиная с версии 2.6.13. К примеру, ее активно использует Beagle - система поиска для Linux. С помощью inotify, можно отслеживать следующие события:
  •  Создание файла;
  •  Удаление файла;
  •  Обращение к файлу;
  •  Изменение файла;
  •  Изменение атрибутов файла;
  •  Открытие или закрытие файла;
  •  Перемещение или переименование файла
Чтобы иметь возможность воспользоваться всем этим, необходимо удостовериться что включена соответсвующая опция в ядре:

Код

File Systems
\--- Inotify file change notification support
     \ --- Inotify support for userspace


Если опция была отключена, необходимо собрать и переустановить ядро, но это тема для отдельной статьи smile

Использовать систему можно через Inotify API, подробности о которой можно узнать вызвав соответствующию man-страницу
Код

man 7 inotify


Либо, что гораздо проще, использовать пакет inotify-tools, последнию версию которого можно получить с http://inotify-tools.sourceforge.net/

Использование inotify-tools

Пакет состоит из двух консольных утилит:

inotifywait - ждет указанных событий над определенным файлом, и завершается при их удовлетворении. Удобно для использования внутри shell-скриптов.
inotifywatch - мониторит определенные события над указаными файлами определенное время, затем выводит статистику по действиям, которые ОС совершала с данным файлом. Это может быть очень полезно при отладке различного ПО.

Более подробную информацию по данным утилитам, вы можете получить обратившись к соответствующим man-страницам:
Код

man inotifywait
man inotifywatch


Простой пример, выводящий сообщение при появлении в /var/log/messages слова "error":
Код

#!/bin/sh
while inotifywait -e modify /var/log/messages; do
  if tail -n1 /var/log/messages | grep error; then
    kdialog --msgbox "Some error occured!"
  fi
done


Другой пример использования inotifywatch - сканирование каталога на наличе вирусов при появлении в нем новых файлов:
Код

#!/bin/sh
while inotifywait -e create /home/ftp/incoming; do
  clamscan /home/ftp/incoming
done


Возможности использования данной системы безграничны, особенно если работать с ней на прямую через Inotify API.
Для любителей языков Perl и Python есть модули http://search.cpan.org/author/TWERNER/Linux-Inotify-0.05/lib/Linux/Inotify.pm и http://rudd-o.com/projects/python-inotify/ соответсвенно.

Автор: JackYF 11.10.2007, 16:12
Отличная статья, самому не раз нужно было делать подобные вещи.  smile 

Автор: spin2 14.10.2007, 15:12
Еще есть tripwire.

Автор: ZeeLax 15.10.2007, 13:59
spin2, у tripware другая цель.

Автор: bilbobagginz 19.10.2007, 12:37
спасибо, Imple ;-)
+1

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)