`
lzqustc
  • 浏览: 209881 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

Perl之Linux::Inotify2

    博客分类:
  • Perl
阅读更多

关于 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 &

 

 

 

分享到:
评论

相关推荐

    Linux inotify

    2. int wd = inotify_add_watch (fd, path, mask);添加一个 watch,wd 是 watch 描述符。 3. int ret = inotify_rm_watch (fd, wd);删除一个 watch 对象。 struct inotify_event 结构体用于描述一个文件系统变化...

    inotify 文件监视

    2. **inotify_add_watch()**:通过这个函数,我们可以指定要监视的目录或文件,将其添加到inotify实例的监视列表中,指定感兴趣的事件类型。 3. **inotify_rm_watch()**:如果不再需要监视某个特定的路径,可以使用...

    Linux unison+inotify 文件实时双向同步

    2. **inotify机制**:inotify是Linux内核提供的一种系统调用,它可以监视文件系统中的各种事件,如创建、删除、修改等。开发者可以编写程序监听这些事件,当特定事件发生时,执行相应的操作。在文件同步场景中,...

    Inotify-API:一些使用 Inotify API 的示例实现

    Inotify API 是 Linux 内核提供的一种文件系统事件监控机制,允许应用程序实时监控文件系统中的各种变化,如创建、删除、移动以及修改等操作。它为开发者提供了高效且低开销的方式来跟踪文件系统的变动,是 C 语言...

    dfs基于Swoole和Inotify的分布式文件服务器

    Inotify是Linux内核提供的一种文件系统事件监控机制,可以监听文件系统中的创建、删除、修改等事件。在分布式文件服务器中,Inotify用于实时监测文件变化,一旦有文件更新,就可以立即通知服务器进行相应的处理,如...

    基于inotify的Linux文件实时监控程序,同时调用河马扫描来检测文件.zip

    2. 监控目标:使用`inotify_add_watch`函数添加要监控的文件或目录,指定感兴趣的事件类型,如IN_MODIFY、IN_CREATE、IN_DELETE等。 3. 读取事件:通过`read`系统调用从inotify的文件描述符读取事件,获取事件的类型...

    python-inotify-examples-0.9.4-4.el7.noarch.rpm

    官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装

    12-inotify.rar

    《Linux与UNIX系统编程手册》源码副本包含的"12-inotify.rar"是一个压缩文件,专注于介绍Linux系统中的inotify机制。inotify是Linux内核提供的一种文件系统事件监控接口,它允许应用程序监视文件系统中的各种变化,...

    两台linux服务器目录实时同步(Rsync+Inotify)

    ### 实时同步技术详解:利用Rsync与Inotify在Linux环境下构建高效同步方案 #### 一、概述 在现代IT环境中,数据同步是一项至关重要的任务,尤其是在多服务器架构下,保持数据的一致性和实时性对于业务连续性至关...

    inotify+rsync 远程备份.7z

    标题 "inotify+rsync 远程备份.7z" 提及了两个关键工具:inotify和rsync,它们在Linux系统中常用于文件监控和数据同步。在远程备份场景中,这两个工具结合使用可以实现高效、实时的备份策略。 **inotify简介:** ...

    inotify-sample.tgz

    2. `inotify_add_watch()`: 添加 watch,将要监控的路径与 inotify 实例关联,指定要监听的事件类型。 3. `read()`: 从 inotify 文件描述符读取事件,获取事件信息,如事件类型、受影响的文件名等。 4. `inotify_rm_...

    inwatch:用于设置 inotify 监视和对事件运行命令的守护进程

    inotify 是 Linux 内核提供的一种文件系统通知机制,能够实时监控文件系统的变化,如文件创建、删除、移动和修改等。 **inotify基础概念** 1. **事件类型**:inotify 提供了多种事件类型,包括文件创建(CREATE)...

    iNotify c语言 demo

    iNotify是Linux内核提供的一种高效的通知机制,用于监视文件系统中的变化,如文件或目录的创建、修改、删除和移动等。这个机制是通过inotify接口实现的,允许应用程序实时跟踪这些变化,而无需持续轮询文件系统,极...

    inotify-tools-3.14.tar.gz+linux文件同步软件(含安装方法和同步脚本)

    Inotify是一种强大的、细粒度的、异步的文件系统事件监控机制, linux内核从 2.6.13起,加入了Inotify支持,通过Inotify可以监控文件系统中添加、删除,修改、移动等各种事件,利用这个内核接口,第三方软件就可以...

    inotify-win:Windows的inotify-wait工具的端口

    赢得胜利Windows的inotifywait工具的端口,请参阅编译中如果您安装了Cygwin,只需在此目录中运行make 。 这将创建可执行文件inotifywait.exe 。 手动填写如下: $ %WINDIR% \M icrosoft.NET \F ramework \v 4.0....

    inotify + rsync实现linux文件实时同步.doc

    2. `inotifywatch`:用于收集被监控文件系统的统计信息,例如每个 `inotify` 事件发生的次数。 安装 `inotify-tools` 通常需要从源代码编译,可以访问 http://inotify-tools.sourceforge.net/ 获取源码,然后按照 `...

    inotify-tools-3.14.tar.gz

    《Inotify工具与Rsync在Linux文件实时同步中的应用》 在Linux系统中,管理和监控文件系统的变更是一项重要的任务,特别是在需要实时同步文件或者备份数据的场景下。Inotify是Linux内核提供的一种文件系统事件监控...

    storm-hdfs-spout:使用HDFS INotify API的风暴喷口

    标题中的"storm-hdfs-spout"是一个专门为Apache Storm设计的组件,它利用了HDFS(Hadoop Distributed File System)的INotify API来实现文件系统事件驱动的数据处理。这个组件允许实时数据流处理系统如Storm能够及时...

Global site tag (gtag.js) - Google Analytics