Кажется, что вы хотите контролировать каталог изменений. Это сложная работа, но для которой есть хорошие модули. Проще всего рекомендовать, вероятно, Linux::Inotify2
Этот модуль реализует интерфейс для Linux 2.6.13 и более поздних версий. Система уведомлений об изменении файла/каталога Inotify.
Это похоже на то, что вы хотели.
Любой такой монитор нуждается в дополнительной обработке событий. В этом примере используется AnyEvent.
use warnings;
use strict;
use feature 'say';
use AnyEvent;
use Linux::Inotify2;
my $dir = 'dir_to_watch';
my $inotify = new Linux::Inotify2 or die "Can't create inotify object: $!";
$inotify->watch($dir, IN_MODIFY | IN_CREATE, sub {
my $e = shift;
my $name = $e->fullname;
say "$name modified" if $e->IN_MODIFY; # Both show the new file
say "$name created" if $e->IN_CREATE; # but see comments below
});
my $inotify_w = AnyEvent->io (
fh => $inotify->fileno, poll => 'r', cb => sub { $inotify->poll }
);
1 while $inotify->poll;
Если вы только заботиться о новых файлов, то вам нужно всего лишь одну константу выше. Для обоих типов событий у $name
есть имя нового файла. Из man inotify
на моей системе
... в name
поле в возвращаемом inotify_event
структуры определяет имя файла в каталоге.
Структура inotify_event
представлена в виде объекта Linux::Inotify2::Watcher
.
Использование IN_CREATE
представляется очевидным решением для вашей цели. Я протестировал, создав два файла, с двумя перенаправленными командами echo
, разделенными точкой с запятой в той же командной строке, а также на touch
- с файлом. Письменные файлы обнаруживаются как отдельные события, а также файл touch
.
Использование IN_MODIFY
также может работать, так как он контролирует (в $dir
)
... любой объект файловой системы в наблюдаемом объекте (всегда каталог), то есть файлы, каталоги, символические ссылки, узлы устройств и т.д. ...
Как и в случае с испытаниями, оба файла, написанные echo
, как указано выше, сообщаются как отдельные события. Но touch
-ed файл не сообщил, что данные не изменились (файл не был записан в).
Что лучше подходит для вашей потребности, зависит от деталей. Например, инструмент может открыть файл журнала по мере его запуска, только для его записи намного позже. В этом случае два пути выше будут вести себя по-другому.Все это необходимо тщательно изучить в соответствии с вашими конкретными условиями.
Мы можем думать о состоянии гонки, поскольку, хотя код выполняет другие файлы, может проскальзывать. Но модуль намного лучше, чем этот, и он сообщает о новых изменениях после завершения обработчика. Я тестировал, создавая файлы, пока этот код работает (и спит), и они сообщаются.
Некоторые другие важные рамки для программирования, управляемые событиями, - это POE и IO::Async.
File::Monitor выполняет эту работу тоже.
zdim, это здорово услышать об этих модулях. Vikas, не уверен, что вы ищете общий монитор файловой системы, который предлагает zdim. Если вы можете поделиться своим кодом Perl, возможно, мы сможем понять, почему он потребляет столько памяти и процессора. – codeforester