Inotify 是一个 Linux特性,它监控文件系统操作,比如读取、写入和创建。Inotify 反应灵敏,用法非常简单,并且比 cron 任务的繁忙轮询高效得多。
前提:192.168.0.1,192.168.0.2和192.168.0.3,1为主
1,在192.168.0.1上下载inotify-tools-3.13-1.i386.rpm和inotify-tools-devel-3.13-1.i386.rpm并安装。
http://www.baidupcs.com/rest/2.0/pcs/file?method=batchdownload&app_id=250528&zipcontent=%7B%22fs_id%22%3A%5B419923751874731%2C309325119372187%5D%7D&sign=DCb740ccc5511e5e8fedcff06b081203:ogLO8isdtnzw4tQw3AyV90Fb%2BSc%3D&uid=3626875272&time=1400228373&prisign=unknow&zipname=%E3%80%90%E6%89%B9%E9%87%8F%E4%B8%8B%E8%BD%BD%E3%80%91inotify-tools-devel-3.13-1.i386%E7%AD%89.zip&cflg=65535%3A1
2,写脚本rsync.sh
#!/bin/sh
#set -x
src="/usr/local/nginx/conf /opt/tomcat" #同步目录,可以多个目录,以空格隔开
des_ip="192.168.0.2 192.168.0.3" #同步ip,可以多个IP,以空格隔开
#function
#function
inotify_fun ()
{
/usr/bin/inotifywait -mrq --timefmt '%d/%m/%y-%H:%M' --format '%T %w%f' -e modify,delete,create,move $1|while read time file
do
for ip in $des_ip
do
echo "`date +%Y%m%d-%T`: rsync -avzq --delete --partial --progress $1 $ip:`dirname $1`"
rsync -avzq --delete --exclude-from=/shell/exclude_file --partial --progress $1 $ip:`dirname $1` #将当下目录不需要同步的文件写入exclude_file
echo
done
done
}
#main
for a in $src
do
inotify_fun $a &
done
3,编写/shell/exclude_file
假如不想将/usr/local/nginx/conf下的nginx.conf和/opt/tomcat下的Catalina.sh同步,那么
vi exclude_file
nginx.conf
catalina.sh
4,对192.168.0.2和3做信任,免认证登陆
在192.168.0.1上操作
# ssh-keygen -t rsa
一路回车
#ssh-copy-id -i .ssh/id_rsa.pub 192.168.0.2
提示输入0.2的密码
输入密码,敲回车
OK!然后ssh 192.168.0.2,是不是不用输密码就进入了呢
那么就就成功了
然后192.168.0.3也做下免认证登陆
#ssh-copy-id -i .ssh/id_rsa.pub 192.168.0.3
5,最后,将rsync.sh后台运行
nohup sh rsync.sh &
或者写几个小脚本
vim start_rsync.sh
nohup /shell/rsync.sh >> /shell/nohup.out&
vim kill_rsync.sh
#!/bin/bash
#若同步目录有增加或减少,请结束所有实时同步进程,然后在开同步脚本,文件在同步时请勿使用此脚本
kill -9 `ps -ef|grep -v grep|grep inotifywait |awk '{print $2}'` && kill -9 `ps -ef|grep -v grep|grep rsync| awk '{print $2}' `
6,test
在192.168.0.1的同步目录下建一个文件或目录,然后查看192.168.0.2和3上在相同目录下是不是也有了呢
ps:常遇问题
有时候当设置的同步目录过多的时候,就需要把/proc/sys/fs/inotify/max_user_watches 数值调大,默认是8192
用vi修改不了这个数值,所以echo 8192000 > /proc/sys/fs/inotify/max_user_watches