关于 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 &
相关推荐
inotify 是 Linux 内核提供的一种文件系统通知机制,能够实时监控文件系统的变化,如文件创建、删除、移动和修改等。 **inotify基础概念** 1. **事件类型**:inotify 提供了多种事件类型,包括文件创建(CREATE)...
这个项目主要适用于熟悉C、Linux Bash、Qt、USB协议、ADB(Android Debug Bridge)、CPP、Perl、Awk、Udev以及shell脚本和inotify工具的用户。 `device-watcher` 使用了几个关键的技术和概念: 1. **USB通信**:...
由国内著名技术社区联合推荐的2012年IT技术力作:《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》,即将上架发行,此书从Web应用、数据备份与恢复、网络存储应用、运维监控与性能优化、集群高级应用等...
- filesystem object (path) watching (with optional linux inotify support). - wallclock-based times (using absolute time, cron-like). - relative timers/timeouts (handle time jumps). - fast intra-...
使用C、Python、Perl等语言都有对应的库来方便地操作inotify。 在实际应用中,文件监控源代码可能包含以下关键部分: 1. 监听器初始化:创建并配置监控对象,指定要监控的目录和感兴趣的事件类型。 2. 事件处理:...
linux WEB服务器 nginx tomcat apache httpd 会写shell脚本bash,perl,python 正则表达式sed awk grep 数据库 防火墙 自动化运维工具zabbix,cacti,nagios 服务器集群 数据库热备份 数据热备RAID 数据备份工具rsync,...