Linux中通过inotify对文件状态进行监听的使用说明
关于inotify的相关概念
inotify是Linux核心子系统之一,做为文件系统的附加功能,它可监控文件系统并将异动通知应用程序。inotify的原始开发者为John McCutchan、罗伯特·拉姆与Amy Griffis。于Linux核心2.6.13发行时(2005年六月十八日),被正式纳入Linux核心(摘自维基百科)
inotify-tools是在inotify的特性基础上开发的文件状态监控工具,实现了对inotify拿来即用。inotify-tools主要提供了两个命令行工具inotify-wait、inotify-wacth用于通过命令行或脚本对某文件系统的事件进行监控,关于这两个命令我会在接下来的命令使用中进行讲解。
如何安装inotify-tools
前面说到inotify-tools是依赖inotify运行的,那么我们首先要确定你的linux是支持inotify的。检查的方式主要有以下两种。
#方法一:通过检查linux内核版本,来确定是否支持inotify。前面已经介绍过你的内核需要大于2.6.13 uname -a #方法二:直接检查系统中是否有相关的inotify描述信息 ls -lsart /proc/sys/fs/inotify #total 0 #0 dr-xr-xr-x 0 root root 0 Sep 19 09:38 .. #0 -rw-r--r-- 1 root root 0 Jan 1 13:51 max_user_watches #0 -rw-r--r-- 1 root root 0 Jan 1 13:51 max_user_instances #0 -rw-r--r-- 1 root root 0 Jan 1 13:51 max_queued_events #0 dr-xr-xr-x 0 root root 0 Jan 1 13:51 . #如果出现上面结果说明系统支持inotify
对于inotify-tools可以源码安装或者是包管理安装,我个人推荐使用包管理进行安装
#方法一:包管理安装 #Centos发行版本 yum install -y inotify-tools #debian发现版本 apt-get install -y inotify-tools #方法二:源码安装 wget https://github.com/inotify-tools/inotify-tools/archive/refs/tags/3.22.1.0.tar.gz tar -zvxf inotify-tools-3.22.1.0.tar.gz cd inotify-tools-3.22.1.0 ./configure --prefix=/usr/local/inotify make make install
如何使用inotify-tools
inotifywait 仅执行阻塞,你可以使用它来监控任何一组文件和目录或监控整个目录树。
命令格式:
inotifywait [-hcmrq] [-e <event> ] [-t <seconds> ] [–format <fmt> ] [–timefmt <fmt> ] <file> [ … ]
具体命令举例
inotifywait -rmq –exclude /root/[test|abc] -e access,create,delete,modify,attrib -timefmt ‘%y/%m/%d %H:%M’ –format ‘%T %w%f %e’ /root/
命令格式:
inotifywait [-hcmrq] [-e <event> ] [-t <seconds> ] [–format <fmt> ] [–timefmt <fmt> ] <file> [ … ]
具体命令举例
inotifywait -rmq –exclude /root/[test|abc] -e access,create,delete,modify,attrib -timefmt ‘%y/%m/%d %H:%M’ –format ‘%T %w%f %e’ /root/
命令与命令参数说明:
命令说明 | inotifywait | 监控文件或者目录的相应事件并返回监控结果 |
inotifywatch | 监控文件或目录的相关事件并输出统计信息 | |
参数说明 | -h | 显示命令的帮助信息 |
@ | 排除对指定文件或者目录的监控 | |
-m | 始终保持监听状态,默认触发事件即退出。 | |
-d | 后台运行,一般和-o配合,需指定输出到文件。 | |
-r | 递归查询目录 | |
-o | 监控信息输出到文件 | |
-s | 输出错误日志 | |
-q | 只打印出监控事件 | |
-c | 以CSV格式打印事件信息 | |
-t | 超时等待时间,为0表示永不超时 | |
-e | 指定监听特定时间,默认监听全部事件。 | |
–exclude | 排除对指定文件或者目录的监控,支持正则表达式匹配文件或者目录 | |
–excludei | 和exclude类似,但是该命令匹配不区分大小写 | |
–fromfile | 从文件中读取需要监听的文件或者目录 | |
–format | 指定事件信息输出格式,%w 表示发生事件的目录,%f 表示发生事件的文件,%e 表示发生的事件,%T表示发生的时间 | |
–timefmt | 指定时间输出格式,%y年 %m月 %d日 %H小时 %M分钟 %T 使用由–timefmt定义的时间格式 |
|
监听事件 | access | 文件或目录读取 |
modify | 文件或目录更改 | |
attrib | 文件或目录属性更改 | |
close_write | 以只读模式打开的文件或目录被关闭 | |
close_nowrite | 以只读模式打开的文件或目录被关闭 | |
close | 文件或目录被关闭,不管它是如何打开的 | |
open | 文件或目录被打开 | |
moved_to | 文件或目录被移入监听目录 即使是在同一目录内移动,此事件也触发 | |
moved_from | 移除监听目录中的文件或目录 即使是在同一目录内移动,此事件也触发 | |
move | 文件或目录发生移动 包括moved_to和 moved_from | |
create | 文件或目录被创建 | |
delete | 文件或目录被删除 | |
delete_self | 文件或目录移除,之后不再监听此文件或目录 | |
unmount | 文件或目录被卸载 |
inotifywatch 用来收集关于被监视的文件系统的统计数据,包括每个 inotify 事件发生多少次。
命令格式:
inotifywatch [-hvzrqf] [-e <event> ] [-t <seconds> ] [-a <event> ] [-d <event> ] <file> [ … ]
由于inotifywatch只是用来做统计的,这里不扩展该命令的更多信息。
命令格式:
inotifywatch [-hvzrqf] [-e <event> ] [-t <seconds> ] [-a <event> ] [-d <event> ] <file> [ … ]
由于inotifywatch只是用来做统计的,这里不扩展该命令的更多信息。
inotify-tools实际使用需求举例
使用inotify-tools来对文件进行监听,优化了以往我们通过轮询监听文件所存在的性能问题。同时inotify-tools提供的丰富的监听事件,省却了我们自行对事件进行定义造轮子的麻烦。基于inotify-tools我们可以在日常工作事项中解决很多需求场景。
例如:
1、监听配置文件,发现修改就执行下发命令。
2、监听重要目录,发现有文件新增或者修改就执行备份命令。
3、监听代码仓库,发现有代码提交就执行构建和部署命令。
下面通过一个使用脚本的例子,来说明inotify-tools的高级应用
#!/bin/bash inotifywait -mrq --timefmt '%y/%m/%d %H:%M' --format '%T %w%f %e' --event delete,modify,create,attrib /root/data | while read date path file event do case $event in ACCESS) echo "${path}${file}被访问" ;; CREATE) echo "新建文件${path}${file},将执行备份命令" bash /root/backup.sh ${path}${file} ;; esac done
本文系作者 @Mr.Lee 原创发布在 维简网。未经许可,禁止转载。