对于Inotify的使用,IBM有一篇文章介绍很详细,不需要我赘述,链接如下:

http://www.ibm.com/developerworks/cn/linux/l-inotifynew/

大家往往使用inotify-tool比较熟悉,对于其监控文件系统的一些特性,却很少有人总结,有些人用开源的 Inotify脚本程序进行rsync同步,但我希望还是要对文件事件进行过滤,否则会做大量的重复操作和冗余操作,主要原因是,在我们队文件进行编辑操 作的时候会产生大量的冗余事件,这些事件有些是临时文件的产生,有些是对监控文件的冗余操作。详细见下面的测试。

测试环境:

ubuntu 文件系统Ext4

CentOS 文件系统Ext3

测试工具: Inotify api编写的监控程序,并将发生的事件打印如下:


如图所示,产生事件256与8,分别代表create事件与write_close事件。

2.使用vi语句创建test文件,vi test,产生事件如下:

如图所示,会产生一些临时文件,他们一swp与swpx进行结尾。其中512事件代表删除文件,可见我们在进行vi的时候,其实背后会有很多额外的操作开销。但具体问什么需要这么繁琐的过程,目前还不清楚。

3.对通过vi打开的文件,进行write操作,在vi命令提示符下执行w,产生如下8个事件


如图所示,这回会产生一些名字叫4913的事件,这个数字貌似是不变的,就是你write其他文件,也会产生4913事件。但如果创建的文件本身名字就叫4913,那么会产生其它数字的临时文件,真是奇怪…

其中64是move_from事件,是将文件mv出当前路径时产生事件,128代表将其他路径文件移入当前路径,移 出与移入操作可以通过cookie值,来确定是否是同一文件。可见,当移动操作时候,是将test移动为test~,其实是修改了名字,通过cookie 可以看出,它们是对同一文件的操作。

如果对vi打开的文件做退出操作,即执行q命令:

对同一个文件做write and close操作的时候,即在vi命令行下,执行wq,则产生10个事件如下:

可见,如果不对事件进行监控,一个简单的write操作都会产生很多冗余事件。

但也有些事件是唯一的,举例如下:

1.对已经产生的文件,重新进行touch操作,如test已经产生了,再次执行touch test操作时事件如下:

如图,只产生了write_close事件,覆盖了已经touch的文件。

2.从其他路径cp一个文件,到监控路径:

相当于进行了一次写覆盖操作。

3.从其他路径move一个文件到监控路径:

只产生了move_to事件。

4.刚才看到了,如果write名为test文件,产生临时文件4913,如果我write名为4913的文件时候,事件如下:

如果write为5036,时候,会产生数字为其它的临时文件,真的是有意思。

所以那些希望使用inotify与Rsync进行同步的用户,脚本里要加上过滤功能啊。

我在后续的文章里提到我自己写的服务器同步程序,功能如下:

1 .过滤临时文件和不需要的事件,比如在write的时候只产生一个事件,这样就之需要rsync一次即可。

2 .当rsync失败的时候,会进行稍后重新执行,如果仍旧失败,10小时候再次执行,确保服务器同步准确。

3 .对于本地没有的文件,我也会对远程文件路径进行删除,同时不会比较其他文件,那些使用 rsync –include=/* –include=xxx.php$ –exclude=*  的用户注意了,那种执行方式,效率很低,会递归比较所有目录。

4.支持主机到多个分机的同步,别且使用多线程同时执行,使文件在所有服务器上保持一致。并且同时同步inotiy产生的多个文件。

5.线程的数量可以根据服务器的性能,进行配置,好服务器可以开得多,同时执行的更多。

可执行文件及源码地址如下: http://code.google.com/p/sersync/