rsync+inotify

来源:互联网 发布:百川砍价源码 编辑:程序博客网 时间:2024/06/10 19:49

rsync+inotify

  • rsyncinotify
    • 判断是否支持inotify
  • inotify监控事件
    • rsync inotify实时备份

inotify是Linux核心子系统之一,做为文件系统的附加功能,它可监控文件系统并将异动通知应用程序。本系统的出现替换了旧有Linux核心里,拥有类似功能之dnotify模块

优点
相较于被inotify替换较旧的 dnotify模块,inotify有诸多益处。[2][3]在旧的模块中,程序必须为每一个被监控的目录创建file descriptor,这种作法很容易让进程拥有的file descriptor逼近系统允许的上限,进而形成瓶颈。dnotify产生的file decriptor也会导致系统资源忙碌,使可移除设备无法被移除,徒增使用上的困扰。
由于dnotify只能让程序员监控目录层级的变化,“精细度”亦是“dnotify”的劣势之一。为此,程序员必须付出额外的心力,自行撰写代码以期追踪更细微的文件系统事件。
inotify相较之下使用较少的file descriptor,亦允许select()与poll()接口,优于dnotify使用的信号系统。这也使得inotify与既有以select()或poll()为基础之库(如:Glib)集成更加便利。

判断是否支持inotify

uname -r #看看内核是否到达了2.6.13或者以上,如果低于2.6.13就需要重新编译ll /proc/sys/fs/inotify/

安装inotify-tools

tar -xvf inotify-tools-3.14.tar.gzcd inotify-tools-3.14./configure --prefix=/usr/local/source/inotify-toolsmake & make install

安装完成后,在安装目录的bin目录下, 有两个可执行程序inotifywait和inotifywatch

inotifywait:用于等待文件或目录上的特定事件,可以监控任何一组文件或目录,或者是监控整个目录树(目录、子目录、子目录的子目录等)。在shell脚本中使用的是inotifywait。 inotifywatch:用于收集被监视的文件系统的统计数据,包括每个inotify事件发生多少次等信息

inotify监控事件

inotify 可以监视的文件系统事件包括:

access:文件被读取modify:文件被修改。attrib:文件属性被修改即元数据(Metadata),如执行chmodchown、touch 等指令。close_write:具有可写权限的文件被关闭。文件内容不一定修改。close_nowrite:不可写文件被关闭,即只读文件被关闭。open:文件被打开moved_from:文件被移走。即文件从被监视的目录中移走。moved_to,文件被移来。即文件被移动到被监视的目录下。create:创建新文件delete:文件被删除,如rmdelete_self:自删除,即一个可执行文件在执行时删除自己,删除后,文件不会被监控。move_self:自移动。即一个可执行文件在执行时移动自己,移动后,该文件不会被监控。unmount:被监控的文件或目录所在的文件系统被 umount,此后不会被监控。close,文件被关闭,等同于(CLOSE_WRITE | CLOSE_NOWRITE)move:文件被移动,等同于move_to和move_from注:上面所说的文件也包括目录。

rsync inotify实时备份

inotify的脚本配置

#!/bin/bashINOTIFYWAIT="/usr/local/source/inotify-tools/bin/inotifywait"EVENTS="-e create,delete,move,modify,attrib"BACKUP="/backup/"SECRETS_FILE="/etc/rsync/rsync.pass"USER="felix"HOST="rsync.felix.com"MODULE="backup"$INOTIFYWAIT -mrq --timefmt '%F %T' --format '%T %w%f' $EVENTS $BACKUP | while read linedo        rsync -vzrogpt --delete --progress --password-file=$SECRETS_FILE $BACKUP $USER@$HOST::$MODULE &> /dev/nulldone

创建/backup目录

[root@vm2 ~]# mkdir /backup[root@vm2 ~]# ls -l /backup/total 0[root@vm2 ~]# 

说明:这里是将所有需要备份的内容放在/backup目录下面,在该目录下面的所有内容都会自动备份。

启动脚本

[root@vm2 ~]# sh /data/script/inotify.sh &

测试

[root@vm2 ~]# cp /etc/hosts .[root@vm2 ~]# ls -l 

同一台机器上2个目录保存同步

#!/bin/bashINOTIFYWAIT="/usr/local/source/inotify-tools/bin/inotifywait"EVENTS="-e create,delete,move,modify,attrib"SOURCE="/dir1/"DEST="/dir2/"$INOTIFYWAIT -mrq --timefmt '%F %T' --format '%T %w%f' $EVENTS $SOURCE | while read linedo        rsync -vzrogpt --delete --progress $SOURCE $DEST &> /dev/nulldone

创建测试目录

[root@vm2 script]# mkdir /dir1[root@vm2 script]# mkdir /dir2[root@vm2 script]# 

启动脚本

sh /data/script/inotify_local_dir.sh &

测试

[root@vm2 ~]# ls -l /dir1 /dir2/dir1:total 0/dir2:total 0[root@vm2 ~]# cp /etc/hosts /dir1[root@vm2 ~]# ls -l /dir1 /dir2
0 0