Мне нужно обрабатывать большие (~ 100 с) сообщения системного журнала, используя Perl и Linux :: Inotify2 .
Я написал тестовый скрипт, который непрерывно генерирует сообщения журнала.Для обработки событий мой Perl-скрипт выглядит следующим образом:
#!/usr/bin/perl
use Linux::Inotify2 ;
use Time::HiRes qw(usleep nanosleep);
# create a new object
my $inotify = new Linux::Inotify2
or die "Unable to create new inotify object: $!" ;
# create watch
$inotify->watch ("/var/log/messages", IN_ACCESS|IN_OPEN|IN_CLOSE|IN_MODIFY|IN_Q_OVERFLOW)
or die "watch creation failed" ;
my $count=0;
while () {
my @events = $inotify->read;
unless (@events > 0) {
print "read error: $!";
last ;
}
#printf "mask\t%d\n", $_->mask foreach @events ;
$count++;
print $count."\n";
usleep(100000);
}
Если я откомментирую функцию usleep для имитации обработки, я замечу, что при остановке скрипта генератора журнала скрипт inotify не догоняетс этим.Другими словами, скрипт inotify Perl теряет события.
Также не отображается сообщение о переполнении.
Как мне убедиться, что даже если моя обработка идет медленно, я не теряю сообщения.Другими словами, как мне определить «буфер», в котором сообщения могут временно храниться?