inotifytools包含两个工具:inotifywatch和inotifywait,inotifywatch返回在监控期间发生的文件系统事件的统计信息,inotifywait会等待文件系统事件的发生。所以如果实时监控文件的变化,就用inotifywait,这两个工具的参数基本很相近,以inotifywait举例说明:
-m 持续的监控事件;默认是接收到一个事件就退出
-r 递归监控目录下的所有子目录,如果目录下包含其他目录也需要监控,就需要使用这个选项
-q 安静模式;默认执行inotifywait会打印两条任务信息,添加此选项会消除系统默认的提示信息
--exclude 排除列表,通过正则表达式匹配上的所有文件都不会被监控,大小写敏感
-t 超时时间,单位是秒;如果在指定的时间内没有发生任何事情,则退出
-e 指定要监控的事件类型;这个参数应该算是比较常用,可以监控的事件类型下面单独举例
--timefmt 自定义输出事件的时间类型
--format 自定义输出事件的显示格式,目前可以支持的格式化参数有下面几个:
%w 被监控事件的文件名
%f 被监控目录内触发事件的文件名
%e 触发的事件类型,通过逗号分隔
%Xe 触发的事件类型,通过设置的X字符分隔
%T 使用自定义的时间格式替换当前时间;使用此格式化字符串需要同时配置--timefmt参数
Event事件类型有如下几种:
access 被监控的文件或者目录内的文件被读取
modify 被监控的文件或者目录内的文件被写入
attrib 被监控的文件或者目录内的文件属性被修改,包括时间戳,文件权限,扩展属性等
close_write 被监控的文件或者目录内的文件已可写模式打开后关闭
close_nowrite 被监控的文件或者目录内的文件已只读模式打开后关闭
close 被监控的文件或者目录内的文件被关闭,不管其打开的模式;事实上这就是通过同时监听close_wait和close_nowrite的一个简单实现
open 被监控的文件或者目录内的文件被打开
moved_to 文件或者目录被移动到监控的目录,这个事件即使在同目录下移动文件也会触发
moved_from 文件或者目录被移出监控的目录,这个事件即使在同目录下移动文件也会触发
move 同时监控moved_to和moved_from
move_self 被监控的文件或者目录自己被移动,这个事件发生之后,原来被监控的文件或者目录将不再被监控
create 在被监听的目录内创建了文件或者目录
delete 在被监听的目录内删除了文件或者目录
delete_self 被监听的文件或者目录自己被删除,这个事件发生之后,原来被监控的文件或者目录将不再被监控
unmount 被监听的文件或者目录所依赖的文件系统被卸载,这个事件发生之后,原来被监控的文件或者目录将不再被监控
接下来看两个示例,如何一直监控目标文件或者目录:
官方帮助给的示例:
1 2 3 4 5 6 7 8 |
#!/bin/sh while inotifywait -e modify /var/log/messages; do if tail -n1 /var/log/messages | grep httpd; then kdialog --msgbox "Apache needs love!" fi done |
另外一种写法:
1 2 3 4 5 6 |
inotifywait -mq --timefmt "%Y%m%d%H%M%S" --format "%T-%|e-%f" -e create /tmp | while read LINE do echo $LINE done |