The OpenNET Project / Index page

[ новости/++ | форум | wiki | теги ]

Слежение за изменением файлов и директорий в Linux shell
Пакет 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;
 
22.09.2008
Ключи: notify, event, watch, file, log, monitoring / Лицензия: CC-BY
Раздел:    Корень / Администратору / Система / Просмотр состояния и мониторинг системы

Обсуждение [ RSS ]
 
  • 1, pavlinux, 19:32, 22/09/2008 [ответить] [смотреть все]
  • +/
    Кроссплатформенное это SGI::FAM - http://search.cpan.org/~jglick/SGI-FAM-1.002/lib/SGI/FAM.pm

     
  • 2, Вася, 16:46, 23/09/2008 [ответить] [смотреть все]
  • +/
    Оно рекурсивно не умеет, точнее только через жопу.

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

     
  • 3, Аноним, 18:42, 24/09/2008 [ответить] [смотреть все]
  • +/
    http://code.activestate.com/recipes/576377/ - 'это умеет рекурсивно
     

    Ваш комментарий
    Имя:         
    E-Mail:      
    Заголовок:
    Текст:



      Закладки на сайте
      Проследить за страницей
    Created 1996-2017 by Maxim Chirkov  
    ДобавитьРекламаВебмастеруГИД  
    Hosting by Ihor