Пакет inotify-tools содержит две полезные утилиты:inotifywait - ожидать наступления определенного события в файле или дирекотории.
inotifywatch - слежение за статистикой изменений и вывод суммарных данных.
Утилиту inotifywait удобно использовать в скриптах, например, когда нужно дождаться
завершения внешней операции с файлом и мгновенно среагировать на изменения.
Напрмер, запустим:
inotifywait /tmp
При попытке создать файл в /tmp утилита завершит работу, выдав:
/tmp/ CREATE,ISDIR v31549
При попытке создать директорию:
/tmp/ CREATE,ISDIR 0
Если необходимо следить за изменением во всех директориях в пределах /tmp,
следует использовать флаг рекурсивного контроля "-r".
Для больших директорий может понадобиться расширить лимит /proc/sys/fs/inotify/max_user_watches.
Используя опцию "--fromfile" можно загрузить список контролируемых файлов и директорий из файла.
Опция "-e" позволяет реагировать только на определенный тип события, например, на удаление файла, игнорируя создание и открытие.
Опция '-m' отменяет мгновенный выход после наступления события, что позволяет организовать
визуальное наблюдение или обработку в цикле.
Пример, скрипта для обработки изменения файла:
#!/bin/sh
inotifywait -e delete -m /tmp/lock/ | while read dir events file; do
echo "Removed $dir$file"
done
При выполнении:
inotifywatch /tmp
и последующем завершении выполнения через задание таймаута или нажатия ctrl+c,
будет выведена суммарная информация по каждому из классов событий, напрмер:
total modify close_write close_nowrite open create delete filename
22 3 4 1 5 4 5 /tmp/
Или
inotifywatch -v -e access -e modify -t 60 -r /var/log
через 60 секунд выдаст:
14 14 /var/log/
2 2 /var/log/apache2
4 4 /var/log/postgresql
Что касается кроссплатформенного решения, которое работает, не только в Linux, но и во FreeBSD,
можно привести пример слежения за изменением файла используя Perl модуль EV (http://search.cpan.org/dist/EV/),
использующий универсальную библиотеку-враппер libev:
#!/usr/bin/perl
use strict;
use EV;
# Следим за изменениями в директории /tmp/watch
# 0 - интервал опроса по умолчанию
my $w = EV::stat "/tmp/watch", 0,
sub {
my ($w, $revents) = @_;
warn $w->path, " has changed somehow.".$w->attr."\n";
$w->stop;
# На время обработки события, прекращаем прием нотификаций.
.....
$w->start;
};
EV::loop;
URL:
Обсуждается: http://www.opennet.me/tips/info/1774.shtml