Linux内核从2.6.13开始,引入了inotify机制,能够对文件系统的变化进行监控,如对文件进行删除、修改、创建等操作,可以及时通知应用程序进行事件的处理。这种相应处理机制,避免了频繁的文件轮询任务,提高了任务的处理效率。
1、检查系统内核版本
# uname -a
2、查看系统是否支持inotify
如果出现上面结果说明系统支持inotify。
3、centos7 安装inotify-tools工具
# yum install inotify-tools
4、查看inotify默认参数
5、修改inotify参数
(1)、命令修改
#sysctl -w fs.inotify.max_user_instances=130
(2)、文件修改
# vim /etc/sysctl.conf
.conf文件中添加如下代码:
fs.inotify.max_user_insyances=130
(3)参数说明
max_user_instances:每个用户创建inotify实例最大值
max_queued_events:inotify队列最大长度,如果值太小,会出现错误,导致监控文件不准确
max_user_watches:要知道同步的文件包含的目录数,可以用:[root@localhost ~]# find/home/chenyz -type d|wc -l统计,必须保证参数值大于统计结果(/home/chenyz为同步文件目录)。
6、inotify-tools提供的两个命令行工具:
inotifywait:通过inotifyAPI等待被监控文件上的相应事件并返回监控结果,默认情况下,正常的结果返回至标准输出,诊断类的信息则返回至标准错误输出。它可以在监控到对应监控对象上指定的事件后退出,也可以进行持续性的监控。
inotifywatch:通过inotify API收集被监控文件或目录的相关事件并输出统计信息。
inotifywait命令使用简介:
inotifywait尤其适用于在脚本中等待某事件的发生,并可基于特定的事件执行相应操作。如将其用于脚本中监控某指定目录中的文件上的修改、新建、删除、属性信息的改变,而后使用rsync命令将某事件对应的文件同步至其它主机上。其常用选项如下:
-m,--monitor:inotifywait的默认动作是在监控至指定文件的特定事件发生一次后就退出了,而使用此选项则可实现持续性的监控;
-r,--recursive:递归监控指定目录下的所有文件,包括新建的文件或子目录;如果要监控的目录中文件数量巨大,则通常需要修改/proc/sys/fs/inotify/max_users_watchs内核参数,因为其默认值为8192。
-e , --event :指定要监控的特定事件,默认是监控所有的事件;此处包括access, modify, attrib,close_write, close_nowirte, close, open, moved_to, moved_from,move, create, delete, delete_selt等;
--timefmt:当在--format选项中使用%T时,--timefrt选项则可以用来指定自定义的符合strftime规范的时间格式,此时间格式可用的格式符可以通过strftime的手册页获取;--timefrt后常用的参数是'%d/%m/%y%H:%M';
--format :自定义inotifywait的输出格式,如--format '%T %w %f';常用的格式符如下:
%w:显示被监控文件的文件名;
%f:如果发生某事件的对象是目录,则显示被监控目录的名字;默认显示为空串;
%T:使用--timefmt选项中自定义的时间格式;
7、例:监控/tmp/test目录及其内部所有文件上发生create,delete,modify,close_write事件,使用如下命令:
# inotifywait -r --timefmt'%d/%m/%y %H:%M' --format '%T %w %f' -ecreate,delete,modify,close_write /tmp/test
此命令在监控到某文件上第一次事件后就会退出,如果想一直监控,则需要为命令添加-m选项
#!/bin/bash
src=/data/www/
dest=/tmp/
/usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M'
--format '%T %w%f%e'-e modify,delete,create,attrib $src | whileread file
do
/usr/bin/rsync -arzuq --progress $src $dest
echo " ${file} was rsynced">>/tmp/rsync.log 2>&1
done