【发布时间】:2011-12-10 06:15:39
【问题描述】:
我需要使用 Perl 和 Linux::Inotify2 处理大量(约 100 秒)系统日志消息。
我编写了一个连续生成日志消息的测试脚本。为了处理事件,我的 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 脚本正在丢失事件。
我也没有看到任何溢出消息。
我如何确保即使我的处理速度很慢,我也不会丢失消息。换句话说,我如何定义一个可以临时存储消息的“缓冲区”?
【问题讨论】:
-
您使用的是哪个模块?有不止一个 Perl 接口可以进行 inotify。
-
另外,您似乎缺少一些代码。例如,你永远不会用任何东西填充
@events。你的usleep电话不在任何循环中。 -
您如何确定缺少事件?要计算您可以尝试的事件数量:
$count += @events. -
我没有看到任何检查队列是否溢出的尝试。另外,
/proc/sys/fs/inotify/max_queued_events设置为什么? -
您可以考虑配置 rsyslog 以将 syslog 消息发送到您的 perl 进程,而不是使用文件系统 / inotify 作为中介。
标签: perl logging event-handling inotify