一、介绍
Inotify
是文件系统事件监控机制,作为
dnotify
的有效替代。dnotify
是较早内核支持的文件监控机制。Inotify
是一种强大的、细粒度的、异步的机制,它满足各种各样的文件监控需要,不仅限于安全和性能。
inotify
可以监视的文件系统事件包括:
IN_ACCESS,即文件被访问
IN_MODIFY,文件被
write
IN_ATTRIB,文件属性被修改,如
chmod、chown、touch
等
IN_CLOSE_WRITE,可写文件被
close
IN_CLOSE_NOWRITE,不可写文件被
close
IN_OPEN,文件被
open
IN_MOVED_FROM,文件被移走,如
mv
IN_MOVED_TO,文件被移来,如
mv、cp
IN_CREATE,创建新文件
IN_DELETE,文件被删除,如
rm
IN_DELETE_SELF,自删除,即一个可执行文件在执行时删除自己
IN_MOVE_SELF,自移动,即一个可执行文件在执行时移动自己
IN_UNMOUNT,宿主文件系统被
umount
IN_CLOSE,文件被关闭,等同于(IN_CLOSE_WRITE
|
IN_CLOSE_NOWRITE)
IN_MOVE,文件被移动,等同于(IN_MOVED_FROM
|
IN_MOVED_TO)
注:上面所说的文件也包括目录。
二、为能在shell下使用inotify特性,需要安装inotify-tools
1、inotify-tools:The
general
purpose
of
this
package
is
to
allow
inotify's
features
to
be
used
from
within
shell
scripts.
下载地址:http://inotify-tools.sourceforge.net/
编译安装
./configure
make
make
install
完成后,注意查看manpage,man
inotify
、
man
inotifywait
inotifywait
仅执行阻塞,等待
inotify
事件。您可以监控任何一组文件和目录,或监控整个目录树(目录、子目录、子目录的子目录等等)。在
shell
脚本中使用
inotifywait。
inotifywatch
收集关于被监视的文件系统的统计数据,包括每个
inotify
事件发生多少次。
2、inotify的系统相关参数:
3、inotifywait
相关的参数(更多,查看manpage):
inotifywait
This
command
simply
blocks
for
inotify
events,
making
it
appropriate
for
use
in
shell
scripts.
It
can
watch
any
set
of
files
and
directories,
and
can
recursively
watch
entire
directory
trees.
-m,
--monitor
-r,
--recursive
traversed.
Newly
created
subdirectories
will
also
be
watched.
-q,
--quiet
三、使用
1.查看是否支持inotify,从kernel
2.6.13开始正式并入内核,RHEL5已经支持。
看看是否有
/proc/sys/fs/inotify/目录,以确定内核是否支持inotify
[root@RHEL5
Rsync]#
ll
/proc/sys/fs/inotify
total
0
-rw-r--r--
1
root
root
0
Oct
9
09:36
max_queued_events
-rw-r--r--
1
root
root
0
Oct
9
09:36
max_user_instances
-rw-r--r--
1
root
root
0
Oct
9
09:36
max_user_watches
2.关于递归:
inotifywait
This
command
simply
blocks
for
inotify
events,
making
it
appropriate
for
use
in
shell
scripts.
It
can
watch
any
set
of
files
and
directories,
and
can
recursively
watch
entire
directory
trees.
3.使用:
#!/bin/sh
src=/opt/webmail
des=/tmp
ip=192.168.7.192
/usr/local/bin/inotifywait
-mrq
--timefmt
'%Y%m%d-%H:%M'
--format
'%T
%e
%w%f'
${src}
|
while
read
file
注:
当要排出同步某个目录时,为rsync添加--exculde=PATTERN参数,注意,路径是相对路径。详细查看man
rsync
当要排除都某个目录的事件监控的处理时,为inotifywait添加--exclude或--excludei参数。详细查看man
inotifywait
另:
/usr/local/bin/inotifywait
-mrq
--timefmt
'%Y%m%d-%H:%M'
--format
'%T
%e
%w%f'
${src}
上面的命令返回的值类似于:
10/03/09
15:31
/wwwpic/1
这3个返回值做为参数传给read,关于此处,有人是这样写的:
inotifywait
-mrq
-e
create,move,delete,CLOSE_WRITE
$SRC
|
while
read
D
E
F;do
细化了返回值。
注:要取得监控文件发生的事件,在--format处指定%e参数,同时,使用--event参数来指定要监控的事件即可,如--format
'%T
%w%f
%e'
--event
modify,delete,create,attrib
说明: 当文件系统发现指定目录下有如上的条件的时候就触发相应的指令,是一种主动告之的而非我用循环比较目录下的文件的异动,该程序在运行时,更改目录内的文件时系统内核会发送一个信号,这个信号会触发运行rsync命令,这时会同步源目录和目标目录。
--timefmt:指定输出时的输出格式
小脚本,同步到多台主机:
大小:
1KB
下载:
下载
更改后,更简单,适用于同步到相同的目录,监控多目录,多文件,同步到多台服务器
#!/bin/sh
#set
-x
#var
src="/usr/local/nginx/html/lib
/usr/local/nginx/html/www
/usr/local/nginx/html/var/www.work.com.conf.php"
des_ip="172.18.1.35
172.18.1.36
172.18.1.37
172.18.1.38"
#function
inotify_fun
()
{
/usr/local/bin/inotifywait
-mrq
--timefmt
'%Y%m%d-%H:%M'
--format
'%T
%e
%w%f'
-e
CLOSE_WRITE,delete,create,move
$1|while
read
time
file
do
for
ip
in
$des_ip
do
echo
"`date
+%Y%m%d-%T`:
rsync
-avzq
--delete
--progress
$1
$ip:`dirname
$1`"
rsync
-avzq
--delete
--progress
$1
$ip:`dirname
$1`
echo
done
done
}
#main
for
a
in
$src
do
inotify_fun
$a
&
done