在Linux平台下我们可以利用2.6内核的inotify监控文件系统机制,通过rsync+inotify-tools+ssh实现触发式远程实时同步,即,当源目录下的文件或目录有变化时,会立即同步到目标目录。
- 安装inotify-tools和rsync,目前各大Linux发行版本都已经具有了rsync与inotify-tools的软件包,推荐通过RPM,yum,apt-get等方式进行安装。
yum install rsync inotify-tools
- 配置ssh key信任,实现无需输入密码同步,参见 http://www.05do.com/blog/content/73
- 创建inotify_rsync.sh脚本,如下:
SRC=/data/webroot/admin.zhugexuetang/ DST=root@10.19.196.161:/data/webroot/admin.zhugexuetang/ inotifywait -mrq -e modify,delete,create,attrib ${SRC} | while read D E F do #rsync -az --delete --exclude='runtime' --exclude='.git' $SRC $DST rsync -az --exclude='runtime' --exclude='.git' $SRC $DST done
相关注解如下:
inotifywait -mrq -e modify,delete,create,attrib ${SRC} | while read D E F
-m 是保持一直监听
-r 是递归查看目录
-q 是打印出事件
-e create,move,delete,modify,attrib 是指 “监听 创建 移动 删除 写入 权限” 事件
rsync -azt --delete --exclude='runtime' --exclude='.git' $SRC $DST
-a 存档模式
-z 压缩文件数据在传输
-t 维护修改时间
-delete 删除于多余文件
要排除同步某个目录时,为rsync添加--exculde=PATTERN参数,注意,路径是相对路径,具体查看man rsync。
要排除某个目录的事件监听的处理时,为inotifywait添加--exclude参数,具体查看man inotifywait。
inotifywait 命令产生三个返回值,分别是“日期,时间,文件” 这3个返回值会做为参数传给read,因此脚本中的“while read D E F” 写法细化了返回值。
- 赋予脚本可执行权限
chmod +x inotify_rsync.sh
- 执行脚本
nohup ./inotify_/root/rsync.sh >/dev/null 2>&1 &
- 设置脚本开机自启动
cat "nohup ./inotify_/root/rsync.sh >/dev/null 2>&1 &" >> /etc/rc.local
- 测试
在/data/webroot/admin.zhugexuetang/目录下增加一个1.txt,然后查看10.19.196.161:/data/webroot/admin.zhugexuetang/目录下是否已经存在了1.txt文件,如果已经存在了,说明同步成功了。