标签: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
原文地址:http://fanqie.blog.51cto.com/9382669/1642073