rsync inotifywait 自动同步


参考

http://ilanni.blog.51cto.com/526870/1605200

inotify-tools与rsync集成

inotify-tools与rsync的集成主要是通过inotifywait命令与rsync命令集成来实现的,并且该集成主要是体现的rsync客户端,而rsync服务器端正需要按照正常的配置进行即可。

注意:该集成的主要目的是把rsync客户端需要备份的文件实时推送到rsync服务器上。


发现一个问题,就是直接cp的时候,会出现error

rsync: failed to connect to xx: Connection refused (111)

rsync error: error in socket IO (code 10) at clientserver.c(124) [sender=3.0.6]


#!/bin/bash

src=/opt/mysqlbak/full/

dest=mysql

ip=xx

/usr/bin/inotifywait -mrq --timefmt '%d/%m/%y%H:%M' --format '%T %w %f' -e modify,delete,create,attrib,MOVED_TO $src | while read DATE TIME DIR FILE;

#考虑close_write参数 

do

filechange=${DIR}${FILE}

/usr/bin/rsync -avz  --delete --progress $src 221mysqlbak@$ip::$dest --password-file=/etc/rsyncd.password &

echo "At ${TIME} on ${DATE}, file $filechange was backed up via rsynce" >>/tmp/rsync.log 2>&1

done


mv则不会,所以添加MOVED_TO


inotify可监控的文件系统事件类型,如下:

IN_ACCESS:文件被访问。

IN_MODIFY:文件被write。

IN_ATTRIB:文件属性被修改,如chmod、chown等。

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)。

注意:上面所说的文件也包括目录。


inotifywait命令详解

有关inotifywait的使用方法,我们可以通过它的帮助信息查看

-m表示始终保持事件监听状态。

-r表示递归查询目录。

-q表示打印出监控事件。

-e通过此参数可以指定要监控的事件。可监听的事件,如下:

access:访问,读取文件。

modify:修改,文件内容被修改。

attrib:属性,文件元数据被修改。

move:移动,对文件进行移动操作。以及重命名,对文件进行重命名。

create:创建,生成新文件

open:打开,对文件进行打开操作。

close:关闭,对文件进行关闭操作。

delete:删除,文件被删除。

--timefmt是指定时间的输出格式,用于--format选项中的%T格式。

--format指定文件变化的详细信息输出格式。格式参数如下:

%w表示发生事件的目录

%f表示发生事件的文件

%e表示发生的事件

%T使用由--timefmt定义的时间格式

%Xe事件以“X”分隔

8.2 inotifywait命令实例

8.1章节我们讲解了inotifywait命令的参数,下面我们来实际使用下inotifywait命令。

我们要监测/home目录下所有文件及目录的变化情况,命令如下:

inotifywait -mrq --timefmt '%y/%m/%d/%H:%M' --format '%T %w %f %e' -e modify,delete,create,attrib,move,open,close,access /home/


inotifywatch参数说明如下:

-h:输出帮助信息。

-v:输出详细信息。

@:排除不需要监视的文件,可以是相对路径,也可以是绝对路径。

–-fromfile:从文件读取需要监视的文件或排除的文件,一个文件一行,排除的文件以@开头。

-z:输出表格的行和列,即使元素为空。

–-exclude:正则匹配需要排除的文件,大小写敏感。

–-excludei:正则匹配需要排除的文件,忽略大小写。

-r:监视一个目录下的所有子目录。

-t:设置超时时间。

-e:只监听指定的事件。该事件与inotifywait监听的事件类型一样。

-a:以指定事件升序排列。

-d:以指定事件降序排列。

inotifywatch命令实例

我们讲解了inotifywatch命令的参数,下面我们来实际使用下inotifywatch命令。

要求统计60秒内/home目录下文件系统的事件,使用如下命令:

inotifywatch -v -e modify,delete,create,attrib,move,open,close,access -e modify -t 60 -r /home

下面我们的所有操作都是在rsync客户端上进行的,其实inotifywait命令与rsync命令集成,我们所要做的只是写一个shell脚本即可

#!/bin/bash

src=/home/back/

dest=www

ip=xx

/usr/bin/inotifywait -mrq --timefmt '%d/%m/%y%H:%M' --format '%T %w %f' -e modify,delete,create,attrib $src | while read DATE TIME DIR FILE;

do

filechange=${DIR}${FILE}

/usr/bin/rsync -avz --delete --progress $src apache@$ip::$dest --password-file=/etc/rsyncd.password &

echo "At ${TIME} on ${DATE}, file $filechange was backed up via rsynce" >>/tmp/rsync.log 2>&1

done

上述脚本写好后,我们要给予其执行权限,然后配置其开机后台运行,并启动。使用如下命令:

chmod 700 inotify.sh

chmod u+x inotify.sh

ll |grep inotify.sh

echo "sh /root/inotify.sh > /dev/null &" >>/etc/rc.local

sh inotify.sh > /dev/null &


注意:

这个脚本有点问题,如果你没有在src中做变更,第一次是不会同步过来的。



本文转自 liqius 51CTO博客,原文链接:http://blog.51cto.com/szgb17/1838406,如需转载请自行联系原作者

上一篇:Codeforces 837E. Vasya's Function


下一篇:图像处理中的一些基本问题解释