最近有一种场景,是需要监听某个文件在创建后是否发生了进程读取的行为,如果是写的话,直接ls -l 就能通过修改时间判断出来,但是读并不会触发文件属性的修改,光是查看属性是无法感知的。

在linux下可以使用inotify-tools 来完成这个场景,只有在内核 2.6.13 (June 18, 2005) 以上的Linux版本中才支持inotify-tools。

在系统中通过 apt-get install inotify-tools 安装后,执行:

inotifywait -o access.out -m  -e access 文件地址

即可对文件进行监听,上面命令的含义为:对某个文件进行监听,不退出,循环监听,且将结果输出到access.out文件中。

更详细的命令格式为:

inotifywait [-hcmrq] [-e <event> ] [-t <seconds> ] [--format <fmt> ] [--timefmt <fmt> ] <file> [ ... ]

选项参数有:

-h|--help     	显示帮助信息
@<file> 排除不需要监视的文件,可以是相对路径,也可以是绝对路径
--exclude <pattern>
正则匹配需要排除的文件,大小写敏感
--excludei <pattern>
正则匹配需要排除的文件,忽略大小写。
-m|--monitor 接收到一个事情而不退出,无限期地执行。默认行为是接收到一个事情后立即退出
-d|--daemon 跟--monitor一样,除了是在后台运行,需要指定--outfile把事情输出到一个文件。也意味着使用了--syslog
-r|--recursive 监视一个目录下的所有子目录
--fromfile <file>
从文件读取需要监视的文件或排除的文件,一个文件一行,排除的文件以@开头
-o|--outfile <file>
输出事件到文件.
-s|--syslog 输出错误信息到系统日志
-q|--quiet 不输出详细信息,只输出事件
-qq 除了致命错误,不会输出任何信息
--timefmt <fmt> 指定时间格式,用于�format选项中的%T格式
-c|--csv 输出csv格式。
-t|--timeout <seconds>
设置超时时间,如果为0,则无限期地执行下去。
-e|--event <event1> [ -e|--event <event2> ... ]
指定监听的时间,如果省略,则侦听所有事件。
--format <fmt> 指定输出格式
%w 表示发生事件的目录
%f 表示发生事件的文件
%e 表示发生的事件
%Xe 事件以“X”分隔
%T 使用由--timefmt定义的时间格式

可监听的事件:

access		    文件或者目录被读
modify 文件或目录被写入
attrib 文件或者目录属性被更改
close_write 文件或目录关闭,在写模式下打开后
close_nowrite 文件或目录关闭,在只读模式打开后
close 文件或目录关闭,而不管是读/写模式
open 文件或目录被打开
moved_to 文件或者目录移动到监视目录
moved_from 文件或者目录移出监视目录
move 文件或目录移出或者移入目录
create 文件或目录被创建在监视目录
delete 文件或者目录被删除在监视目录
delete_self 文件或目录移除,之后不再监听此文件或目录
unmount 文件系统取消挂载,之后不再监听此文件系统

除了文件,也可以监听目录:

inotifywait -rmq /data

此工具包还包含一个inotifywatch工具,用来收集关于被监视的文件系统的统计数据,包括每个 inotify 事件发生多少次。

命令格式:

inotifywatch [-hvzrqf] [-e <event> ] [-t <seconds> ] [-a <event> ] [-d <event> ] <file> [ ... ]

选项参数:

-h|--help    	            显示帮助信息
-v|--verbose 详细信息
@<file> 排除不需要监视的文件,可以是相对路径,也可以是绝对路径
--fromfile <file> 从文件读取需要监视的文件或排除的文件,一个文件一行,排除的文件以@开头
--exclude <pattern> 正则匹配需要排除的文件,大小写敏感
--excludei <pattern> 正则匹配需要排除的文件,忽略大小写。
-z|--zero 输出表格的行和列,即使元素为空
-r|--recursive 监视一个目录下的所有子目录
-t|--timeout <seconds>
设置超时时间,如果为0,则无限期地执行下去。
-e|--event <event1> [ -e|--event <event2> ... ]
指定监听的时间,如果省略,则侦听所有事件。
-a|--ascending <event> 以指定事件升序排列
-d|--descending <event> 以指定事件降序排列

更多的使用方式,请查看 inotifywatch man page


扫码手机观看或分享: