码迷,mamicode.com
首页 > 其他好文 > 详细

rsync+inotify

时间:2015-05-05 16:52:05      阅读:617      评论:0      收藏:0      [点我收藏+]

标签:rsync   inotify   rsync+inotify   

    rsync只是用来同步的工具,我们也可以做个cron计划任务来定时执行rsync来同步,但是却无法实时的自动同步。


    inotify可以监控目录,并且在发生事件(modify、delete、create、close_write、move、close、unmount、attrib等)时会发出通知。 我们可以写个脚本,只要有通知响应发生,就运行rsync.


    我们这里只是简单的实现实时同步,还是很容易的。 不过像rsync+inotify这种组合在文件数量非常多的情况下可能就不好用了。


一、 确认linux内核支持inotify.


  • linux内核2.6.13以上

  • [root@CentOS7 ~]# ll /proc/sys/fs/inotify
    total 0
    -rw-r--r--. 1 root root 0 May  5 11:11 max_queued_events
    -rw-r--r--. 1 root root 0 May  5 11:11 max_user_instances
    -rw-r--r--. 1 root root 0 May  5 11:11 max_user_watches
    [root@CentOS7 ~]#



二、安装inotify-tools工具


    在2.6.13以上内核中就集成了inotify的功能,我们只要安装上用户空间的工具inotify-tools。

    inotify下载网站:https://github.com/rvoicilas/inotify-tools/wiki

    直接下载源码:http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz

./configure --prefix=/usr/local
make && make install

    直接安装上就可以。

[root@CentOS7 inotify-tools-3.14]# ll /usr/local/bin
total 116
-rwxr-xr-x. 1 root root 60908 May  5 11:16 inotifywait
-rwxr-xr-x. 1 root root 55175 May  5 11:16 inotifywatch
[root@CentOS7 inotify-tools-3.14]#

    inotifywait 就是监控目录的工具, 而inotifywaitch是用来统计数据的。

 

三、定义脚本并说明参数

 

#!/bin/bash
ip="172.16.0.1"        #rsync服务端
dir="/var/www"         #所监控和所要同步的目录

/usr/local/bin/inotifywait -mrq --timefmt "%Y %H:%M:%S" --format ‘%T %w%f %e‘ -e modify,delete,create,move $dir |      #通知信息管道给while。
while read event;do                  
        /usr/bin/rsync -a --password-file=/etc/rsyncd.passwd --delete $dir ursync@$ip::test
done

    

 inotifywait参数可以看这里:http://blog.slogra.com/post-452.html

    大约来说: -m 是表示一直保侍着监控状态,不然发生一次事件以后就会退出命令了。

               -r 递归监控目录。

               -q 仅打印监控事件信息。 忽略其它的信息。

               --timefmt  用来指定-%T中所表现出来的时间格式。定义字符跟date命令中的一样。

                           如: %Y表示完整格式的年,%m月,%d日,%H时,%M分,%S秒。

               --format   用来定义发生事件以后所发出的通知格式。

                            如: %T 时间,%w事件目录,%f事件文件,%e事件类型。

                -e 定义所监控的事件

    事件类型:

           modify、delete、create、close_write、move、close、unmount、attrib

           modify  修改文件。 对创建文件,删除文件,修改文件属性不会触发。

           create  创建文件。 只对创建文件触发。 注意用vim编辑文件的时候生成.swp文件

           delete  删除文件,只对删除文件触发。  用vim编辑完文件以后会删除.swp文件

           close_write 暂时没有搞明白, 不过在创建一个文件或修改文件都会触发。 

           move 在用mv移动文件或重命名的时候。

           close  关闭文件时,就算是ls一下也会产生通知,会有大量的触发

           unmount  卸载

           attrib  属性改变


    注意: 事件切不可写多了,因为有些事件在同一种操作下都会发生触发,也就产生了多条通知,这样就等于是执行了多次rsync。


    上面的脚本中,由inotifywait来产生通知, 直接管道给while,这就等于是产生了一个操作,就会执行rsync。 在没有产生通知的时候,while就会一直在等待输入。 

bash inotify1.sh &

     直接执行就可以了, 只不过现在不看服务端都不知道有没有同步成功,可以在里面加上echo来把event变量的值给保存下来, event就是上面inotifywait所触发的通知啊。


如:

#!/bin/bash
ip="172.16.0.1"
dir="/var/www"

/usr/local/bin/inotifywait -mrq --timefmt "%Y %H:%M:%S" --format ‘%T %w%f %e‘ -e modify,delete,create,move $dir |
while read event;do

        echo -n $event >> /var/log/inotify   #通知保存到文件
        /usr/bin/rsync -a --password-file=/etc/rsyncd.passwd --delete $dir ursync@$ip::test 2>> /var/log/inotify                        #如果有错误输出也保存到文件
        [ $? -eq 0 ] && echo -e "\033[32m\t\tOK\033[0m" >> /var/log/inotify || echo -e "\033[31m\t\tFail\033[0m" >> /var/log/inotify    #OK 或者 Fail

done

    



http://www.linux78.com/rsync-way-installation-configuration-1.html

看写的挺详细的,留着以后用到再看。



吃好,玩好,身体好

本文出自 “On Foot” 博客,请务必保留此出处http://fanqie.blog.51cto.com/9382669/1642073

rsync+inotify

标签:rsync   inotify   rsync+inotify   

原文地址:http://fanqie.blog.51cto.com/9382669/1642073

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!