欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Perl之Linux::Inotify2

程序员文章站 2022-04-29 14:08:05
...

关于 inotify 机制的详细介绍可以参考文章:

inotify -- Linux 2.6 内核中的文件系统变化通知机制

文章写得很详细,而且还给出了c语言实现的例子。

 

下面我就来说说Perl里面,如何利用Linux::Inotify2 实现任务异步操作的例子。

比如 A进程(线程)将要完成的任务按一定规则 写到inotify监控的目录下,通过inotify机制自动解析并完成任务的执行。

 

# 下面的脚本就是 inotify发现被监控的目录有变化了,通过读取变化的文件,解析变完成任务

use utf8;

use JSON;

use Linux::Inotify2;

# inotify based job excution engine

 

my $inotify = new Linux::Inotify2 or die "unable to create new inotify obj: $!";

 

# 创建被监控的相关目录

mkdir "/var/inotify" unless -d "/var/inotify";

mkdir "/var/inotify/jobs" unless -d "/var/inotify/jobs";   #被监控(即待完成的任务)的目录

mkdir "/var/inotify/done" unless -d "/var/inotify/done"; #已完成操作的目录

 

# 举例说明:添加新任务到 jobs目录下,保持任务id的唯一性如 oid1,oid2....

# /var/inotify/jobs/oid1 

# /var/inotify/jobs/oid2 

# /var/inotify/jobs/oid3

 

#上述任务完成后, 将其移到done目录

# /var/inotify/done/oid1 

# /var/inotify/done/oid2 

# /var/inotify/done/oid3

 

# 一些日志

system("date >/var/inotify.log");

system("whoami >>/var/inotify.log");

system("echo 'pid: $$' >>/var/inotify.log");

 

$inotify->watch("/var/inotify/jobs", IN_CLOSE_WRITE, sub {

      my $e = shift;

      my $job_file = $e->fullname;

 

      append_to_file("/var/inotify.log", "\n>>> [".localtime(time)."] job file: ".$job_file."\n".read_from_file($job_file)."\n");

 

      ##################################################

      # 执行任务

 

      print $job_file,"\n";

      my @entries = split /\r\n/, read_from_file($job_file); #文件内容按行分割到数组

      foreach my $obj (@entries) {

            ## ....

            my @arry = split(/ m: /,$obj); #按一定规则解析

            print $arry[0],"\n";

            print $arry[1],"\n";

            append_to_file("/var/inotify.log", "\n\n>>>>> [".localtime(time)."] array: ".$arry[0]." ".$arry[1]."\n");

            if (index($arry[0],"redpack") >= 0) { #任务1

                  &task1($arry[1]);

            } else { #任务2

                  &task2($arry[0],$arry[1]);

            }

      }

 

      ########################################

      # 任务完成 移到 done目录

      system("mv $job_file /var/inotify/done/");

});

 

# 辅助函数

sub append_to_file {

    open FILE, ">>", $_[0];

    print FILE $_[1];

    close FILE;

}

 

sub read_from_file {

    local $/;

    open FILE, $_[0];

    my $c = <FILE>;

    close FILE;

    return $c;

}

 

sub write_to_file {

    open FILE, ">", $_[0];

    print FILE $_[1];

    close FILE;

}

 

sub task1 {

}

 

sub task2 {

}

 

1 while $inotify->poll;

 

 

通过下面的命令让上面的脚本作为常驻进程运行:

nohup  perl inotify.pl > /dev/null 2>&1 &

 

 

 

相关标签: perl linux