--> 脚本读取目录列表(脚本所在目录下的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协议发送日志,也可以通过加密的方式发送日志。

发表评论