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_events 8192 设置inotifywait或inotifywatch命令可以监视的文件数量(单进程) max_user_instances 128 设置每个用户可以运行的inotifywait或inotifywatch命令的进程数 max_user_watches 16384 设置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目录下60 s内发生对应的事件
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"