使用 Perl 和 Linux::Inotify2 模块监控 Mac 地址的日志文件

Posted

技术标签:

【中文标题】使用 Perl 和 Linux::Inotify2 模块监控 Mac 地址的日志文件【英文标题】:Monitor a log file for Mac Address using Perl and Linux::Inotify2 Module 【发布时间】:2014-07-28 15:09:35 【问题描述】:

我目前有我的脚本,我的目标是能够监控每秒更新的实时日志文件,并且一旦我的脚本找到这个 f8:27:93:88:1c:95 mac 地址它将该行写入脚本。

#!/usr/bin/perl
my $mac = "f8:27:93:88:1c:95";
open (OUT, ">output.txt");
sub Reader ()
    @a1 = `Tail System.log`;

sub Parser ()
    if( $_=~ m/f8:27:93:88:1c:95/ )
        print OUT $_;
    

我的目标是能够看到这个日志文件,它每秒都在更新,所以 tail 不能正常工作。

这是来自日志文件的 sn-p

> [2014-07-18 14:11:22,849] <inform_stat-1> WARN event - [event] User[f8:27:93:0c:da:c5] roams from AP[dc:9f:db:1a:61:bd] to AP[dc:9f:db:1a:61:b9] on "channel 44(na)"

【问题讨论】:

您的问题是什么?这就像一个为你编写程序的请求。 我需要帮助使用inotify,我不明白如何使用它。 你读过documentation吗?编辑您的问题以包含具体您遇到的问题。 【参考方案1】:

也许使用像File::Tail这样的cpan模块

#!/usr/bin/perl

use strict;
use warnings;
use autodie;

use File::Tail;

my $infile = 'System.log';
my $outfile = 'output.txt';
my $mac = 'f8:27:93:88:1c:95';

open my $outfh, '>', $outfile;

my $tail = File::Tail->new($infile);
while (defined(my $line = $tail->read)) 
    print $outfh $line if $line =~ m/\Q$mac/;

【讨论】:

这是否仍然有效,因为日志文件每秒都在更新,我之前尝试过 tail,但效果不佳,因为文件一直在更新。 是的,这适用于不断增长的日志文件。唯一的限制是该模块似乎无法在 Windows 上轻松安装。所以只要你在基于 Mac 或 Unix 的机器上,这应该可以正常工作。【参考方案2】:

您已经提到日志每秒都会更改。因此 inotify 对您的情况没有多大帮助。因此,我建议将您的 perl 脚本作为守护程序运行,以便它可以不断分析您的日志文件并将结果输出到文本文件。为了避免负载,您应该使用 seek 和 tell 以便整个文件不需要加载到服务器中。下面的代码将为您工作。

#!/usr/bin/perl
use POSIX qw(setsid);
use LWP::Simple;
$| = 1;
# daemonize the program
&daemonize;
while(1)

open (DATA,"</var/log/log");
open (OUT, ">output.txt");
my $position = 0;
$position = `cat /tmp/position` if -e "/tmp/position";
seek (DATA,$position,0);
while (<DATA>)

if( $_=~ m/f8:27:93:88:1c:95/ )
        print OUT $_;
    

$position = tell(DATA);
open (DATA1,">/tmp/position");
print DATA1 $position;
close(DATA);
close(DATA1);
close(OUT);

sub daemonize 
chdir '/' or die "Can’t chdir to /: $!";
open STDIN, '/dev/null' or die "Can’t read /dev/null: $!";
open STDOUT, '>>/dev/null' or die "Can’t write to /dev/null: $!";
open STDERR, '>>/dev/null' or die "Can’t write to /dev/null: $!";
defined(my $pid = fork) or die "Can’t fork: $!";
exit if $pid;
setsid or die "Can’t start a new session: $!";
umask 0;

【讨论】:

不需要任何模块 无法在@INC 中找到 LWP/Simple.pm(@INC 包含:/etc/perl /usr/local/lib/perl/5.14.2 /usr/local/share/perl/ 5.14.2 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.14 /usr/share/perl/5.14 /usr/local/lib/site_perl .) 在 Search.pl 第 3 行。BEGIN 失败--编译在 Search.pl 第 3 行中止。

以上是关于使用 Perl 和 Linux::Inotify2 模块监控 Mac 地址的日志文件的主要内容,如果未能解决你的问题,请参考以下文章

为啥inotify会丢失事件?

Linux::Inotify2 和线程

在 perl 中使用 inotify 监视多个文件

在后台运行的单个 perl 脚本可以保存多个 Log4Perl 实例吗?

如何使用 Doxygen 和 Doxygen::Filter::Perl 为 Perl 子例程生成文档?

Perl 和 .NET RSA 一起工作?从 Perl 公钥在 .NET 中加密?从 Perl 加载私钥?