inotify监控文件的更改

| 暂无评论 | 暂无引用通告

-->       脚本读取目录列表(脚本所在目录下的db.conf),将目录添加到inotify监控中,被监控目录下新创建的目录也会被添加到监控中去.被监控目录下创建的文件或文件内容被更改后,脚本以日志的方式文件名发送给本机的syslog。脚本发送日志时使用的facility为local2,priority为info,进程名为inotifyd。
      脚本的内容如下:
#!/usr/bin/perl

use strict;
use Event;
use Linux::Inotify2;
use POSIX;
use IO::File;
use Sys::Syslog qw(:DEFAULT setlogsock);

my $script_dir="/opt/";
our $CONF_FILE=$script_dir."db.conf";


#For Daemon
###################################################
sub daemonize {
        chdir "/";
        open STDIN, "</dev/null";
        open STDOUT, ">/dev/null";
        open STDERR, ">&STDOUT";
        defined(my $pid=fork) or die "Can't fork: $!\n";
        exit if($pid);
        POSIX::setsid() or die "Can't start a new session: $!";
        umask 0;
}

sub add_watch {
        my ($inotify,$log_file)=@_;
        open FH,$log_file;
        while(<FH>){
                my $file=$_;
                chomp $file;
                $inotify->watch ($file, IN_ALL_EVENTS, \&mywatch)
        }
        close FH;
}

####################################################
                         
&daemonize;

my $ident="inotify";
my $logopt="ndelay";
my $facility="local2";
my $priority="info";
openlog $ident, $logopt, $facility;       # don't forget this


our $INOTIFY_OBJECT=new Linux::Inotify2;
Event->io (fd => $INOTIFY_OBJECT->fileno, poll => 'r', repeat => 1, cb => sub { $INOTIFY_OBJECT->poll });

Event->signal (signal => 'HUP',cb => \&re_conf);

add_watch($INOTIFY_OBJECT,$CONF_FILE);

Event::loop;

sub re_conf{
        add_watch($INOTIFY_OBJECT,$CONF_FILE);
        Event::loop;
}


sub mywatch {
        my $e = shift;
        my $PATH= $e->fullname;
        my $MASK= $e->mask;
  
  
        if($e->IN_ISDIR){
         if($e->IN_CREATE){
            $INOTIFY_OBJECT->watch($PATH,IN_ALL_EVENTS, \&mywatch);
                    return;
        }
        }else{
            if($e->IN_MODIFY || $e->IN_CREATE){
                    syslog($priority,$PATH);
                    return
            }
    }
}

例如,我们需要监控/data下的目录:

将脚本保存在/opt下命名为inotifyd.pl
安装脚本使用的模块:
cpan Event
cpan Linux::Inotify2
cpan Sys::Syslog
设定脚本所在目录
vi /opt/inotifyd.pl
my $script_dir="/opt/";
检测脚本是否可运行:

[supersun@supersun.biz opt]$ perl -c inotifyd.pl
inotifyd.pl syntax OK


配置syslog.conf,添加以下的行:
local2.*                                                /var/log/inotify.log
或将日志发送给日志主机loghost
local2.*                                                @loghost

更改message行:
auth,authpriv,cron,daemon,kern,lpr,news,syslog,user.info;mail.none;authpriv.none;cron.none              /var/log/messages
不然的话inotify的日志也会发送至/var/log/messages中去

创建需要监控的目录的列表:
find /data -type d >/opt/db.conf

启动脚本
perl inotifyd.pl

脚本接收HUP信号,重新读加监控目录列表,将上次未加载的录添加到监控中。

如果目录列表很长的话,使用top查看进程状态,态状为R时,inotifyd.pl正在加载目录列表,状态S时,脚本已开始监控。

查看/var/log/inotify.log(根椐自己/etc/syslog.conf中的配置)中的日志输出。

Mar 20 15:36:28 supersun.biz inotify: /data/hello.txt

syslog使用的udp协议发送日志,如何使syslog监听udp的514端口可以参考将防火墙的日志发送给日志主机
syslog-ng可以使用tcp协议发送日志,也可以通过加密的方式发送日志

 

暂无引用通告

发送引用通告网址: http://supersun.info/mt/mt-tb.cgi/926
如果您想引用这篇日记到您的Blog,请复制上面的链接,放置到您发表文章时的相应界面中。

发表评论

最新资源

  • IMG_1437.JPG
  • line.png
  • bar.png
  • perl_calander.jpg

关于此日记

此日记由 supersun 发表于 2009年3月20日 15:48

此Blog上的上一篇日记Perl:将日志发送给syslog

此Blog上的下一篇日记FTP传输模式binary和ASCII的区别

首页归档页可以看到最新的日记和所有日记。