inotify异步监控机制

inotify是Linux内核提供的一种文件系统事件监控机制,从2.6.13版本开始支持,允许程序异步地观察文件系统变化,避免了轮询带来的资源消耗。inotify-tools包括inotifywait和inotifywatch两个命令行工具,前者用于等待并响应文件系统事件,后者则用于收集事件统计信息。文章详细介绍了这两个工具的使用方法和参数解析,以及如何在脚本中应用inotifywait。

1.inotify 简介

  • inotify是一种强大的,细粒度的,异步的文件系统事件监控机制(软件),linux内核从2.6.13起,加入了Inotify支持,通过Inotify可以监控文件系统中添加,删除,修改,移动等各种事件。
  • inotify实际是一种事件驱动机制,它为应用程序监控文件系统事件提供了实时响应事件的机制,而无须通过诸如cron等的轮询机制来获取事件。cron等机制不仅无法做到实时性,而且消耗大量系统资源。相比之下,inotify基于事件驱动,可以做到对事件处理的实时响应,也没有轮询造成的系统资源消耗,是非常自然的事件通知接口,也与自然世界的事件机制相符合。
  • inotify 的实现有几款软件:inotify-tools、sersync、lsyncd

注:sersync软件实际上就是在 inotify软件基础上进行开发的,功能要更加强大些 ,多了定时重传机制,过滤机制了提供接口做 CDN,支持多线程橾作。是国人周洋在金山公司开发的。

2.部署 inotify 软件

是否支持:
~]# uname -r		#2.6.13以上内核版本
3.10.0-957.el7.x86_64

~]# ll /proc/sys/fs/inotify/	#在没安装inotify软件之前,应该有这三个文件
total 0
-rw-r--r-- 1 root root 0 Sep 10 22:38 max_queued_events
-rw-r--r-- 1 root root 0 Sep 10 22:38 max_user_instances
-rw-r--r-- 1 root root 0 Sep 10 22:38 max_user_watches
文件说明:
文件默认值作用说明
max_queued_events8192设置inotifywait或inotifywatch命令可以监视的文件数量(单进程)
max_user_instances128设置每个用户可以运行的inotifywait或inotifywatch命令的进程数
max_user_watches16384设置inotify实例事件(event)队列可容纳的事件数量
安装inotify-tools:
~]# rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
~]# yum install -y inotify-tools	#依赖于epel源
inotify-tools提供了两个命令行工具:
~]# rpm -ql inotify-tools | grep /bin
/usr/bin/inotifywait
/usr/bin/inotifywatch

inotifywait: 在被监控的文件或目录上等待特定文件系统事件(open,close,delete等)发生,执行后处于阻塞状态,适合shell脚本中使用。
inotifywatch: 用于收集文件系统的统计数据,例如发生了多少次inotify事件,某文件被访问了多少次等等,一般用不上。

2.1 inotifywait 命令参数解析

基础参数:
参数含义
-m, --monitor(重要参数)始终保持事件监听。
-d, --daemon以守护进程运行
-r, --recursive(重要参数)递归监控目录数据信息变化
-o, --outfile 打印事件到文件中,相当于标准正确输出
-s, --syslog发送错误到syslog相当于标准错误输出
-q, --quiet(重要参数)输出信息少(只打印事件信息)
–exclude <pattern>排除文件或目录
–excludei <pattern>排除文件或目录时,不区分大小写
–timefmt <fmt>(重要参数)指定时间输出格式
–format <fmt>(重要参数)打印使用指定的输出类似格式字符串;即实际监控输出内容
-e, --event(重要参数)(重要参数)指定监听指定的事件,如果省略,表示所有事件都进行监听
inotifywait -e [参数] 可指定事件类型:
事件名称事件说明
access文件或目录内容被读取
modify文件或目录内容被写入
attrib文件或目录属性改变
close_write(重要参数)文件或目录关闭,在写入模式打开之后关闭的。
close_nowrite文件或目录关闭,在只读模式打开之后关闭的
close文件或目录关闭,不管读或是写模式
open文件或目录被打开
moved_to文件或目录被移动到监控的目录中
moved_from文件或目录被移动从监控的目录中
move(重要参数)文件或目录不管移动到或是移出监控目录都触发事件
create(重要参数)文件或目录创建在监控目录中
delete(重要参数)文件或目录被删除在监控目录中
delete_self文件或目录被删除,目录本身被删除
unmount文件系统包含的文件或目录取消挂载
isdir监控目录相关操作
inotifywait --format <fmt> 事件格式参数:
命令参数参数说明
%w(重要参数)事件出现时,监控文件或目录的名称信息
%f(重要参数)事件出现时,将显示监控目录下触发事件的文件或目录信息,否则为空
%e(重要参数)显示发生的事件信息,不同的事件信息用逗号进行分隔
%Xe显示发生的事件信息,不同的事件信息有x进行分隔,可以修改X为指定分隔符
%T输出时间格式中定义的时间格式信息,通过 --timefmt option 语法格式指定时间信息
inotifywait 参数 --timefmt <fmt> 事件格式参数:
命令参数参数说明
%d(重要参数)每月的第几天,显示倍息为十进制数(范围是 01-31 )
%m(重要参数)显示月份,显示信息为十进制(范围 01-12 )
%M显示分钟,显示信息为十进制(范围 00-59 )
%y(重要参数)年份信息,显示信息为十进制,并且没有世纪信息
%Y年份信息,显示信息为十进制,并且包含世纪信息
%H小时信息,显示信息为十进制,使用 24小时制(范围 00-23 )

2.2 inotifywait测试

监控目录:
~]# mkdir /work		#监控/work目录
# inotifywait -mrq /work --timefmt "%y/%m/%d %H:%M" --format "%T %w%f %e" -e create,delete,close_write,move	
# --timefmt指定输出时间格式
# --format指定输出字符串,%T输出--timefmt指定的时间格式内容
# -e,不适用该参数默认为监听所有事件,我们这儿只监听了创建、删除、修改、移动等事件
创建普通文件:
~]# touch test.file		#新开会话进行操作

~]# inotifywait -mrq /work --timefmt "%y/%m/%d %H:%M" --format "%T %w%f %e" -e create,delete,close_write,move
19/09/10 23:34 /work/test.file CREATE
19/09/10 23:34 /work/test.file CLOSE_WRITE,CLOSE
创建目录:
~]# mkdir testdir

~]# inotifywait -mrq /work --timefmt "%y/%m/%d %H:%M" --format "%T %w%f %e" -e create,delete,close_write,move
19/09/10 23:34 /work/testdir CREATE,ISDIR
写入数据:
~]# echo "hello world" > test.file 

~]# inotifywait -mrq /work --timefmt "%y/%m/%d %H:%M" --format "%T %w%f %e" -e create,delete,close_write,move
19/09/10 23:34 /work/test.file CLOSE_WRITE,CLOSE
修改数据:
~]# vim test.file 

~]# inotifywait -mrq /work --timefmt "%y/%m/%d %H:%M" --format "%T %w%f %e" -e create,delete,close_write,move
19/09/10 23:52 /work/.test.file.swp CREATE
19/09/10 23:52 /work/.test.file.swx CREATE
19/09/10 23:52 /work/.test.file.swx CLOSE_WRITE,CLOSE
19/09/10 23:52 /work/.test.file.swx DELETE
19/09/10 23:52 /work/.test.file.swp CLOSE_WRITE,CLOSE
19/09/10 23:52 /work/.test.file.swp DELETE
19/09/10 23:52 /work/.test.file.swp CREATE
19/09/10 23:52 /work/4913 CREATE
19/09/10 23:52 /work/4913 CLOSE_WRITE,CLOSE
19/09/10 23:52 /work/4913 DELETE
19/09/10 23:52 /work/test.file MOVED_FROM
19/09/10 23:52 /work/test.file~ MOVED_TO
19/09/10 23:52 /work/test.file CREATE
19/09/10 23:52 /work/test.file CLOSE_WRITE,CLOSE
19/09/10 23:52 /work/test.file~ DELETE
19/09/10 23:52 /work/.test.file.swp CLOSE_WRITE,CLOSE
19/09/10 23:52 /work/.test.file.swp DELETE
移入文件:
]# cp /etc/hosts testdir/

~]# inotifywait -mrq /work --timefmt "%y/%m/%d %H:%M" --format "%T %w%f %e" -e create,delete,close_write,move
19/09/10 23:35 /work/testdir/hosts CREATE
19/09/10 23:35 /work/testdir/hosts CLOSE_WRITE,CLOSE
移出文件:
~]# mv test.file /tmp/ 

~]# inotifywait -mrq /work --timefmt "%y/%m/%d %H:%M" --format "%T %w%f %e" -e create,delete,close_write,move
19/09/10 23:49 /work/test.file MOVED_FROM
删除文件:
~]# rm -f testdir/hosts 

~]# inotifywait -mrq /work --timefmt "%y/%m/%d %H:%M" --format "%T %w%f %e" -e create,delete,close_write,move
19/09/10 23:51 /work/testdir/hosts DELETE

更多参数大家可以自行测试使用。

2.3 inotifywatch命令参数解析

虽然这个命令用的不多,但本文还是对其做一个简单分析。

参数含义
-v, --verbose输出详细信息
-r, --recursive监视一个目录下的所有子目录
-t, --timeout设置超时时间
-a, --ascending以指定事件升序排列
-d, --descending以指定事件降序排列
–exclude正则匹配需要排除的文件,大小写敏感
–excludei正则匹配需要排除的文件,忽略大小写
@<file>排除不需要监视的文件,可以是相对路径,也可以是绝对路径
–formfile <file>从文件读取需要监视的文件或排除的文件,一个文件一行,排除的文件以@开头
-e, --event只监听指定的事件
简单使用:
~]# mkdir hello{1..10}
~]# touch hello1/file{1..5}
~]# rm -f hello1/file{1..2}

~]# inotifywatch -v -e create,delete,close_write,move -t 60 -r /work  	#监控/work目录下60s内发生对应的事件
Establishing watches...
Setting up watch(es) on /work
OK, /work is now being watched.
Total of 1 watches.
Finished establishing watches, now collecting statistics.
Will listen for events for 60 seconds.
total  close_write  create  delete  filename
12     5            5       2       /work/hello1/
10     0            10      0       /work/

2.4 inotifywait在脚本中的简单使用

#!/bin/bash
#author by chuan

inotifywait -mrq --timefmt '%y/%m/%d %H:%M' --format '%T %w%f %e' -e create,delete,close_write,move,isdir /work |\
while read line
do
    if echo $line | grep -i -E "CREATE|CLOSE_WRITE|DELETE|MOVED_TO|MOVED_FROM";then
        echo $line >> /tmp/inotify.log
    fi
done

2.5 inotify系统参数修改

可以根据实际需求将三个文件的数值调大,监听更大的范围

临时修改:
~]# echo "16385" >> max_queued_events 
~]# echo "129" >> max_user_instances
~]# echo "8193" >> max_user_watches
永久生效:
~]# sysctl -w fs.inotify.max_queued_events="16385"
~]# sysctl -w fs.inotify.max_user_instances="129"
~]# sysctl -w fs.inotify.max_user_watches="8193"
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值