参考
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,如需转载请自行联系原作者