关于 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原理: Inotify是一种文件系统变化通知的机制,文件或者文件夹的增删等这些事件都可以即刻反映在用户空间。
linux 文件监视事件 inotify, inotify 是一个 Linux 内核特性,它监控文件系统,并且及时向专门的应用程序发出相关的事件警告,比如删除、读、写和卸载操作等。
dfs:基于 Swoole 和 Inotify 的分布式文件服务器
linux rsync及inotify实时同步,实现并确保文件及实时同步
官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装
inotify 1/4 http://www.boobooke.com/v/bbk4196 inotify 2/4 http://www.boobooke.com/v/bbk4197 inotify 3/4 http://www.boobooke.com/v/bbk4198 inotify 4/4 http://www.boobooke.com/v/bbk4199
赢得胜利Windows的inotifywait工具的端口,请参阅编译中如果您安装了Cygwin,只需在此目录中运行make 。 这将创建可执行文件inotifywait.exe 。 手动填写如下: $ %WINDIR% \M icrosoft.NET \F ramework \v 4.0....
通知API 一些使用 Inotify API 的示例实现
NULL 博文链接:https://dutianzhao.iteye.com/blog/2162220
Inotify是一种强大的、细粒度的、异步的文件系统事件监控机制, linux内核从 2.6.13起,加入了Inotify支持,通过Inotify可以监控文件系统中添加、删除,修改、移动等各种事件,利用这个内核接口,第三方软件就可以...
风暴hdfs喷口使用风暴喷口基于文件系统事件生成元组。要求管理员对HDFS的访问权限Hadoop> = 2.6.0当前功能生成元组以响应CLOSE事件。
方便linux使用者使用的脚本,望大佬完善信息,但不要搞破坏,谢谢使用 #### 软件架构 软件架构说明 ssh免密 rsync+inotify两个服务结合 #### 安装教程 使用wget命令直接下载发行版链接即可 或者点击进行下载 ####...
事件之 EPOLLRDHUP: 陈硕blog: Go内存分析: 蓝牙和wifi管理: NetworkManager proxy: DHCP doc: XScreensaver: NetworkManager Doc: NetworkManager Proxies: sshuttle全局代理的实现简析 iptables: http proxy: ...
inotify, 面向 Rust 编程语言的惯用inotify包装器 inotify Idiomatic inotify 用于 Rust 程序语言的包装器。extern crate inotify;use std::env;use inotify::{ event_m
监视用于设置 inotify 监视和对事件运行命令的守护程序。
linux :CentOS 7下用rsync+inotify实现实时同步,可以实现文件之间的同步备份。
声化一个简易的消息通知系统,支持企业微信,电报机器人,邮件推送类似服务器酱,容易扩展示例站点: ://inotify.cf功能支持通道设置用户管理系统状态代理设置 Github登陆外部日志通道支持企业微信应用消息电报...
NULL 博文链接:https://sharejava.iteye.com/blog/1776333
这是监视文件夹变化的程序,指定监视的文件夹类型
hdfs-inotify-example HDFS iNotify示例 有关iNotify的信息,请参见 ,尤其是幻灯片#16 您必须以hdfs用户身份运行此工具。 Usage: $ java -jar hdfs-inotify-example-uber.jar <HDFS> [] 这是一个快速而肮脏的...