Last active
November 16, 2017 17:27
-
-
Save shangdev/ee4d56e9238aa25b3b4fe9c28149b984 to your computer and use it in GitHub Desktop.
Centos6.8: inotify+rsync install
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
1. 检查你的服务器版本是否支持inotify机制,如果输出 CONFIG_INOTIFY_USER=y 则表示支持 | |
$ grep INOTIFY_USER /boot/config-$(uname -r) | |
2. 编译安装inofity-tools工具包 | |
$ wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz | |
$ tar -zxvf inotify-tools-3.14.tar.gz | |
$ ./configure --prefix=/usr --libdir=/lib64 && make && make install | |
3. 脚本 | |
#!/bin/bash | |
src=/home/wwwroot/trueniu-php/trueniu/ # 需要同步的源路径 | |
des=rsync_208 # 目标服务器上 rsync --daemon 模块名称 | |
rsync_passwd_file=/etc/rsync_client.pwd # 本机 rsync 验证的密码文件 | |
ip1=172.30.10.208 # 目标服务器IP | |
user=www # 目标服务器上 rsync --daemon 定义的验证用户名 | |
cd ${src} # 此方法中,由于rsync同步的特性,这里必须要先cd到源目录,inotify再监听 ./ 才能rsync同步后目录结构一致,有兴趣的同学可以进行各种尝试观看其效果 | |
/usr/bin/inotifywait -mrq --format '%Xe %w%f' -e modify,create,delete,attrib,close_write,move ./ | while read file # 把监控到有发生更改的"文件路径列表"循环 | |
do | |
INO_EVENT=$(echo $file | awk '{print $1}') # 把inotify输出切割 把事件类型部分赋值给INO_EVENT | |
INO_FILE=$(echo $file | awk '{print $2}') # 把inotify输出切割 把文件路径部分赋值给INO_FILE | |
echo "-------------------------------$(date)------------------------------------" | |
echo $file | |
#增加、修改、写入完成、移动进事件 | |
#增、改放在同一个判断,因为他们都肯定是针对文件的操作,即使是新建目录,要同步的也只是一个空目录,不会影响速度。 | |
if [[ $INO_EVENT =~ 'CREATE' ]] || [[ $INO_EVENT =~ 'MODIFY' ]] || [[ $INO_EVENT =~ 'CLOSE_WRITE' ]] || [[ $INO_EVENT =~ 'MOVED_TO' ]] # 判断事件类型 | |
then | |
echo 'CREATE or MODIFY or CLOSE_WRITE or MOVED_TO' | |
rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} # INO_FILE变量代表路径哦 -c校验文件内容 | |
#仔细看 上面的rsync同步命令 源是用了$(dirname ${INO_FILE})变量 即每次只针对性的同步发生改变的文件的目录(只同步目标文件的方法在生产环境的某些极端环境下会漏文件 现在可以在不漏文件下也有不错的速度 做到平衡) 然后用-R参数把源的目录结构递归到目标后面 保证目录结构一致性 | |
fi | |
#删除、移动出事件 | |
if [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]] | |
then | |
echo 'DELETE or MOVED_FROM' | |
rsync -avzR --delete --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} | |
#看rsync命令 如果直接同步已删除的路径${INO_FILE}会报no such or directory错误 所以这里同步的源是被删文件或目录的上一级路径,并加上--delete来删除目标上有而源中没有的文件,这里不能做到指定文件删除,如果删除的路径越靠近根,则同步的目录月多,同步删除的操作就越花时间。这里有更好方法的同学,欢迎交流。 | |
fi | |
#修改属性事件 指 touch chgrp chmod chown等操作 | |
if [[ $INO_EVENT =~ 'ATTRIB' ]] | |
then | |
echo 'ATTRIB' | |
if [ ! -d "$INO_FILE" ] # 如果修改属性的是目录 则不同步,因为同步目录会发生递归扫描,等此目录下的文件发生同步时,rsync会顺带更新此目录。 | |
then | |
rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} | |
fi | |
fi | |
done | |
4. 每两小时做1次全量同步 | |
$ crontab -e | |
$ * */2 * * * rsync -avz --password-file=/etc/rsync-client.pass /data/ [email protected]::data && rsync -avz --password-file=/etc/rsync-client.pass /data/ [email protected]::data | |
5. inotifywait 参数说明 | |
参数名称 参数说明 | |
-m,–monitor 始终保持事件监听状态 | |
-r,–recursive 递归查询目录 | |
-q,–quiet 只打印监控事件的信息 | |
–excludei 排除文件或目录时,不区分大小写 | |
-t,–timeout 超时时间 | |
–timefmt 指定时间输出格式 | |
–format 指定时间输出格式 | |
-e,–event 后面指定删、增、改等事件 | |
6. inotifywait events事件说明 | |
事件名称 事件说明 | |
access 读取文件或目录内容 | |
modify 修改文件或目录内容 | |
attrib 文件或目录的属性改变 | |
close_write 修改真实文件内容 | |
close_nowrite | |
close | |
open 文件或目录被打开 | |
moved_to 文件或目录移动到 | |
moved_from 文件或目录从移动 | |
move 移动文件或目录移动到监视目录 | |
create 在监视目录下创建文件或目录 | |
delete 删除监视目录下的文件或目录 | |
delete_self | |
unmount 卸载文件系统 | |
7. 优化 Inotify | |
$ echo 50000000 > /proc/sys/fs/inotify/max_user_watches -- 把他加入/etc/rc.local就可以实现每次重启都生效 | |
$ echo 50000000 > /proc/sys/fs/inotify/max_queued_events |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment