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 (ok), 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, Аноним (3), 18:42, 24/09/2008 [ответить]  
  • +/
    http://code.activestate.com/recipes/576377/ - 'это умеет рекурсивно
     

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




    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру