最近有一种场景,是需要监听某个文件在创建后是否发生了进程读取的行为,如果是写的话,直接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 文件系统取消挂载,之后不再监听此文件系统
|
除了文件,也可以监听目录:
此工具包还包含一个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
扫码手机观看或分享: