URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID3
Нить номер: 43990
[ Назад ]

Исходное сообщение
"Раздел полезных советов: Слежение за изменением файлов и директорий в Linux shell"

Отправлено auto_tips , 22-Сен-08 19:32 
Пакет 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


Содержание

Сообщения в этом обсуждении
"Слежение за изменением файлов и директорий в Linux shell"
Отправлено pavlinux , 22-Сен-08 19:32 
Кроссплатформенное это SGI::FAM - http://search.cpan.org/~jglick/SGI-FAM-1.002/lib/SGI/FAM.pm


"Слежение за изменением файлов и директорий в Linux shell"
Отправлено Вася , 23-Сен-08 16:46 
Оно рекурсивно не умеет, точнее только через жопу.

Для всей файловой системы dazuko нужен.


"Слежение за изменением файлов и директорий в Linux shell"
Отправлено Аноним , 24-Сен-08 18:42 
http://code.activestate.com/recipes/576377/ - 'это умеет рекурсивно