#inotify事件监控工具
标签(空格分隔):vip资料,付费查看
[TOC]
文章目录
inotify简介
inotify是Linux内核2.6.13 (June 18, 2005)版本新增的一个子系统(API),它提供了一种监控文件系统(基于inode的)事件的机制,可以监控文件系统的变化如文件修改、新增、删除等,
inotify既可以监控文件,也可以监控目录。当监控目录时,它可以同时监控目录及目录中的各子目录及文件的。
rsync + inotify 组合
Rsync(remote sync)远程同步工具,通过rsync可以实现对远程服务器数据的增量备份同步,但rsync自身也有瓶颈,同步数据时,rsync采用核心算法对远程服务器的目标文件进行比对,只进行差异同步。如果服务器的文件数量达到了百万千万量级,那么文件对比将是非常耗时的。而且发生变化的往往是其中很少的一部分,这是非常低效的方式。inotify的出现,可以缓解rsync不足之处,取长补短。
参数说明
inotifywait命令参数说明
参数 | 说明 |
---|---|
-r --recursive | 递归查询目录 |
-q --quiet | 打印很少的信息,仅仅打印监控事件的信息 |
-m,–monitor | 始终保持事件监听状态,永远监控 |
–exclude | 排除文件或目录时,不区分大小写。 |
–timefmt | 指定时间输出的格式,后常用的参数是%d %m %y %H %M |
–format | 指定输出信息的格式 |
-e,–event | 通过此参数可以指定需要监控的事件 |
-d,–daemon | 后台运行,以守护进程方式运行 |
inotify事件信息参数
-e :–event的各种事件含义
Events | 说明 |
---|---|
access | 文件或目录被读取 |
modify | 文件或目录内容被修改 |
attrib | 文件或目录属性被改变 |
close | 文件或目录封闭,无论读/写模式 |
open | 文件或目录被打开 |
moved_to | 文件或目录被移动至另外一个目录 |
move | 文件或目录被移动到另一个目录或从另一个目录移动至当前目录 |
create | 文件或目录被创建在当前目录 |
delete | 文件或目录被删除 |
umount | 文件系统被卸载 |
–format参数说明
参数 | 说明 |
---|---|
%e | 显示触发事件信息 |
%w | 显示监控目录信息 |
%f | 触发事件数据信息 |
%w | 显示被监控文件的文件名 |
部署inotify
1.本地yum仓库里没有包,需要下载epel源,我用的是阿里的
[root@localhost ~]# wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-archive-6.repo
[root@localhost ~]# ls /etc/yum.repos.d/
CentOS-Base.repo epel.repo
下完成后,在/etc/ym.repos.d可以看到epel.repo文件
1.2重新加载缓存
[root@localhost ~]# yum makecache
1.3yum安装
[root@localhost ~]# yum -y install inotify-tools
[root@localhost ~]# which inotifywait
/usr/bin/inotifywait
查看命令,安装成功
测试inotify事件监控工具
本地测试
1.xshell连接一台虚机,打开两个窗口。测试create
在一个窗口输入命令,开始监控/aaa
[root@localhost aaa]# inotifywait -qrm --timefmt '%y %m %d %H %M' --format '%T %w %f' -e create /aaa
在第二个窗口创建文件
[root@localhost aaa]# touch {1..5}.jpg
此时第一个窗口会提示以下内容
[root@localhost aaa]# inotifywait -qrm --timefmt '%y %m %d %H %M' --format '%T %w %f' -e create /aaa
22 11 21 08 48 /aaa/ 1.jpg
22 11 21 08 48 /aaa/ 2.jpg
22 11 21 08 48 /aaa/ 3.jpg
22 11 21 08 48 /aaa/ 4.jpg
22 11 21 08 48 /aaa/ 5.jpg
参数解释:
-q:打印很少的信息,仅仅打印监控事件的信息
-m:始终保持事件监听状态
-r:递归查询目录
--timefmt:指定时间输出的格式
--format: 指定输出信息的格式
create:文件或目录被创建在当前目录
1.2测试delete
第一个窗口输入命令,开始监控/aaa目录
[root@localhost aaa]# inotifywait -qrm --timefmt '%y %m %d %H %M' --format '%T %w %f' -e delete /aaa
第二个窗口删除/aaa里的东西
[root@localhost aaa]# rm -rf *
此时第一个窗口提示以下内容
[root@localhost aaa]# inotifywait -qrm --timefmt '%y %m %d %H %M' --format '%T %w %f' -e delete /aaa
22 11 21 10 22 /aaa/ 1.jpg
22 11 21 10 22 /aaa/ 2.jpg
22 11 21 10 22 /aaa/ 3.jpg
22 11 21 10 22 /aaa/ 4.jpg
22 11 21 10 22 /aaa/ 5.jpg
1.3测试close_write
在第一个窗口操作
[root@localhost ~]# inotifywait -qrm --timefmt '%y %m %d %H %M' --format '%T %w %f' -e close_write /aaa
在第二个窗口操作
[root@localhost aaa]# touch 111
[root@localhost aaa]# echo 2222 > 111
[root@localhost aaa]# cp 111 222
此时第一个窗口会提示
[root@localhost ~]# inotifywait -qrm --timefmt '%y %m %d %H %M' --format '%T %w %f' -e close_write /aaa
22 11 21 10 31 /aaa/ 111
22 11 21 10 31 /aaa/ 111
22 11 21 10 32 /aaa/ 222
总结:close_write中,移动,改名字,删除不会提示
一般用create,delete,close_write这三个选项
2.编写inotify脚本
[root@localhost www]# vim inotify.sh
#!/bin/bash
#2000-11-21
#inotify本地实时监控脚本
/usr/bin/inotifywait -mrq --format '%w%f' -e close_write,delete /aaa | while read line
do
if [ -f $line ];then
/usr/bin/rsync -az $line /tmp --delete &> /dev/null
else
/usr/bin/rsync -az /aaa/ /tmp --delete &> /dev/null
fi
done
shell特殊语句:while read line 配合管道符号,接收管道符传递的数据。并进行复制 “管道符的数据” 赋值给 变量 line
编写inotify+rsync远程监控脚本
#!/bin/bash
backup_Server=192.168.200.162
/usr/bin/inotifywait -mrq --format '%w%f' -e create,close_write,delete /aaa | while read line
do
if [ -f $line ];then
rsync -az $line --delete rsync_backup@$backup_Server::backup --password-file=/etc/rsync.password
else
rsync -az /aaa/ --delete rsync_backup@$backup_Server::backup --password-file=/etc/rsync.password
fi
done
脚本可以加入开机启动:
echo "/bin/sh /www/inotify.sh &" >> /etc/rc.local
提示:& 从后台开始运行该条命令。