1
2
3
4
5
6
|
inotify_init
# 用于创建一个 inotify 实例的系统调用,并返回一个指向该实例的文件描述符
inotify_init1与
# inotify_init 相似,并带有附加标志。如果这些附加标志没有指定,将采用与 inotify_init 相同的值
inotify_add_watch
# 增加对文件或者目录的监控,并指定需要监控哪些事件。标志用于控制是否将事件添加到已有的监控中,是否只有路径代表一个目录才进行监控,是否要追踪符号链接,是否进行一次性监控,当首次事件出现后就停止监控
inotify_rm_watch
# 从监控列表中移出监控项目
read
# 读取包含一个或者多个事件信息的缓存
close
# 关闭文件描述符,并且移除所有在该描述符上的所有监控。当关于某实例的所有文件描述符都关闭时,资源和下层对象都将释放,以供内核再次使用
|
1
2
3
4
5
|
1 使用 inotify_init 打开一个文件描述符
2 添加一个或者多个监控
3 等待事件
4 处理事件,然后返回并等待更多事件
5 当监控不再活动时,或者接到某个信号之后,关闭文件描述符,清空,然后退出。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
IN_ACCESS 被监控项目或者被监控目录中的条目被访问过。例如,一个打开的文件被读取。
IN_MODIFY 被监控项目或者被监控目录中的条目被修改过。例如,一个打开的文件被修改。
IN_ATTRIB 被监控项目或者被监控目录中条目的元数据被修改过。例如,时间戳或者许可被修改。
IN_CLOSE_WRITE 一个打开的,等待写入的文件或目录被关闭。
IN_CLOSE_NOWRITE 一个以只读方式打开的文件或目录被关闭。
IN_CLOSE 一个掩码,可以很便捷地对前面提到的两个关闭事件(IN_CLOSE_WRITE | IN_CLOSE_NOWRITE)进行逻辑操作。
IN_OPEN 文件或目录被打开。
IN_MOVED_FROM 被监控项目或者被监控目录中的条目被移出监控区域。该事件还包含一个 cookie 来实现 IN_MOVED_FROM 与 IN_MOVED_TO 的关联。
IN_MOVED_TO 文件或目录被移入监控区域。该事件包含一个针对 IN_MOVED_FROM 的 cookie。如果文件或目录只是被重命名,将能看到这两个事件,如果它只是被移入或移出非监控区域,将只能看到一个事件。如果移动或重命名一个被监控项目,监控将继续进行。参见下面的 IN_MOVE-SELF。
IN_MOVE 可以很便捷地对前面提到的两个移动事件(IN_MOVED_FROM | IN_MOVED_TO)进行逻辑操作的掩码。
IN_CREATE 在被监控目录中创建了子目录或文件。
IN_DELETE 被监控目录中有子目录或文件被删除。
IN_DELETE_SELF 被监控项目本身被删除。监控终止,并且将收到一个 IN_IGNORED 事件。
IN_MOVE_SELF 监控项目本身被移动。
|
1
2
3
4
|
环境
CentOS6.5 x86_64位 采用最小化安装,系统经过了基本优化
selinux为关闭状态,iptables为无限制模式
源码包存放位置:
/root
|
1
2
3
4
5
6
|
[root@
rsync
-client ~]
# uname -r
2.6.32-431.el6.x86_64
[root@
rsync
-client ~]
# ll /proc/sys/fs/inotify/*
-rw-r--r-- 1 root root 0 Jun 4 15:30
/proc/sys/fs/inotify/max_queued_events
-rw-r--r-- 1 root root 0 Jun 4 15:30
/proc/sys/fs/inotify/max_user_instances
-rw-r--r-- 1 root root 0 Jun 4 15:30
/proc/sys/fs/inotify/max_user_watches
|
1
2
3
4
5
6
7
8
9
10
11
12
|
/proc/sys/fs/inotify/max_queued_events
默认值: 16384
该文件中的值为调用inotify_init时分配给inotify instance中可排队的event的数目的最大值,超出这个值得事件被丢弃,但会触发IN_Q_OVERFLOW事件
/proc/sys/fs/inotify/max_user_instances
默认值: 128
指定了每一个real user ID可创建的inotify instatnces的数量上限
/proc/sys/fs/inotify/max_user_watches
默认值: 8192
指定了每个inotify instance相关联的watches的上限,也就是每一个inotify实例可监控的最大目录数。如果监控的文件数目巨大,需要根据实际情况适当增加此值得大小。
注意:
max_queued_events 是 Inotify 管理的队列的最大长度,文件系统变化越频繁,这个值就应该越大!如果你在日志中看到Event Queue Overflow,说明max_queued_events太小需要调整参数后再次使用
|
1
2
|
[root@
rsync
-client ~]
#
echo
10000000 >
/proc/sys/fs/inotify/max_user_watches
|
1
2
3
4
5
6
|
[root@
rsync
-client ~]
# yum install make gcc gcc-c++
[root@
rsync
-client ~]
# wget http://nchc.dl.sourceforge.net/project/inotify-tools/inotify-tools/3.13/inotify-tools-3.13.tar.gz
[root@
rsync
-client ~]
# tar xzf inotify-tools-3.13.tar.gz
[root@
rsync
-client ~]
# cd inotify-tools-3.13
[root@
rsync
-client inotify-tools-3.13]
# ./configure
[root@
rsync
-client inotify-tools-3.13]
# make && make install
|
1
2
3
|
[root@
rsync
-client ~]
# ll /usr/local/bin/inotify*
-rwxr-xr-x. 1 root root 38582 Jun 3 22:23
/usr/local/bin/inotifywait
-rwxr-xr-x. 1 root root 40353 Jun 3 22:23
/usr/local/bin/inotifywatch
|
1
2
|
inotifywait 仅执行阻塞,等待 inotify 事件,你可以使用它来监控任何一组文件和目录,或监控整个目录树(目录、子目录、子目录的子目录等等),并且可以结合 shell 脚本,更好的使用 inotifywait。
inotifywatch 用来收集关于被监视的文件系统的统计数据,包括每个 inotify 事件发生多少次。
|
1
|
inotifywait [-hcmrq] [-e ] [-t ] [--
format
] [--timefmt ] [ ... ]
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
-h,–help
# 输出帮助信息
@
# 排除不需要监视的文件,可以是相对路径,也可以是绝对路径
–fromfile
# 从文件读取需要监视的文件或排除的文件,一个文件一行,排除的文件以@开头
-m,–monitor
# 接收到一个事情而不退出,无限期地执行。默认行为是接收到一个事情后立即退出
-d,–daemon
# 跟–monitor一样,除了是在后台运行,需要指定 –outfile把事情输出到一个文件。也意味着使用了–syslog
-o,–outfile
# 输出事情到一个文件而不是标准输出。
-s,–syslog
# 输出错误信息到系统日志
-r,–recursive
# 监视一个目录下的所有子目录。
-q,–quiet
# 指定一次,不会输出详细信息,指定二次,除了致命错误,不会输出任何信息。
–exclude
# 正则匹配需要排除的文件,大小写敏感。
–excludei
# 正则匹配需要排除的文件,忽略大小写。
-t,–timeout
# 设置超时时间,如果为0,则无限期地执行下去。
-e,–event
# 指定监视的事件。
-c,–csv
# 输出csv格式。
–timefmt
# 指定时间格式,用于–format选项中的%T格式。
–
format
# 指定输出格式。
%w 表示发生事件的目录
%f 表示发生事件的文件
%e 表示发生的事件
%Xe 事件以“X”分隔
%T 使用由–timefmt定义的时间格式
|
1
2
3
4
5
6
7
8
9
|
[root@
rsync
-client ~]
# inotifywait -rm /etc
Setting up watches. Beware: since -r was given, this may take a
while
!
Watches established.
/etc/
OPEN ld.so.cache
/etc/
CLOSE_NOWRITE,CLOSE ld.so.cache
/etc/
CREATE
test
/etc/
OPEN
test
/etc/
ATTRIB
test
/etc/
CLOSE_WRITE,CLOSE
test
|
1
2
3
4
5
6
7
8
|
[root@
rsync
-client ~]
# inotifywait -mrq -e create,modify,delete /home
/home/
CREATE,ISDIR test2
/home/test2/
CREATE .bash_profile
/home/test2/
MODIFY .bash_profile
/home/test2/
CREATE .bash_logout
/home/test2/
MODIFY .bash_logout
/home/test2/
CREATE .bashrc
/home/test2/
MODIFY .bashrc
|
1
2
3
|
[root@
rsync
-client ~]
# inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f %e' --event modify,delete,attrib /etc/passwd
27
/06/14
16:39
/etc/passwd
ATTRIB
27
/06/14
16:39
/etc/passwd
IGNORED
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
[root@
rsync
-client ~]
# cat web_watch.sh
#!/bin/bash
inotifywait -mrq --timefmt
'%y/%m/%d %H:%M'
--
format
'%T %w%f %e'
--event delete,modify,create,attrib
/data/web
|
while
read
date
time
file
event
do
case
$event
in
MODIFY|CREATE|MOVE|MODIFY,ISDIR|CREATE,ISDIR|MODIFY,ISDIR)
echo
$event
'-'
$
file
'-'
$
date
'-'
$
time
>>
/var/log/web_watch
.log
;;
MOVED_FROM|MOVED_FROM,ISDIR|DELETE|DELETE,ISDIR)
echo
$event
'-'
$
file
'-'
$
date
'-'
$
time
/var/log/web_watch
.log
;;
esac
done
[root@
rsync
-client ~]
# cat /var/log/web_watch.log
CREATE-
/data/web/a-14/06/27-16
:21
CREATE-
/data/web/aa-14/06/27-16
:21
CREATE-
/data/web/aaaa-14/06/27-16
:24
CREATE-
/data/web/aaaaa-14/06/27-16
:24
|
1
|
inotifywatch [-hvzrqf] [-e ] [-t ] [-a ] [-d ] [ ... ]
|
1
2
3
4
5
6
7
8
9
10
11
12
|
-h,–help
# 输出帮助信息
-
v
,–verbose
# 输出详细信息
@
# 排除不需要监视的文件,可以是相对路径,也可以是绝对路径。
–fromfile
# 从文件读取需要监视的文件或排除的文件,一个文件一行,排除的文件以@开头。
-z,–zero
# 输出表格的行和列,即使元素为空
–exclude
# 正则匹配需要排除的文件,大小写敏感。
–excludei
# 正则匹配需要排除的文件,忽略大小写。
-r,–recursive
# 监视一个目录下的所有子目录。
-t,–timeout
# 设置超时时间
-e,–event
# 只监听指定的事件。
-a,–ascending
# 以指定事件升序排列。
-d,–descending
# 以指定事件降序排列
|
1
2
3
4
5
6
7
8
9
|
[root@
rsync
-client ~]
# inotifywatch -v -e create -e modify -e delete -t 30 -r /home
Establishing watches...
Setting up
watch
(es) on
/home
OK,
/home
is now being watched.
Total of 3 watches.
Finished establishing watches, now collecting statistics.
Will listen
for
events
for
60 seconds.
total modify create delete filename
8 3 4 1
/home/
|