利用 inotifywait
对文件系统事件实时监控, 触发事件调用 rsync
远程同步文件至一台或多台服务器
同步指定目录 (缺点: 每次触发都要扫描整个目录进行文件差异对比, 文件越多越耗时长)
#!/bin/bash
user=root
ip=192.168.0.2
source=/data/
target=/data/
log_path=/var/log/inotifywait.log
inotifywait -mrq ${source} --timefmt '%Y-%m-%d %H:%M:%S' --format '%T %w %f %e' -e create,modify,attrib,move,delete,close_write |
while read files; do
echo "$files" >> ${log_path}
INO_EVENT=$(echo $files | awk '{print $5}')
# 增改查类型
if [[ $INO_EVENT =~ 'CREATE' ]] || [[ $INO_EVENT =~ 'MODIFY' ]] || [[ $INO_EVENT =~ 'CLOSE_WRITE' ]] || [[ $INO_EVENT =~ 'MOVED_TO' ]] || [[ $INO_EVENT =~ 'ATTRIB' ]]
then
rsync -avzc ${source} ${user}@${ip}:${target}
fi
# 删除&移出事件
if [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]]
then
rsync -avz --delete ${source} ${user}@${ip}:${target}
fi
done
针对性同步, 同步只针对发生改变的文件的目录
ps: 多级目录下, 移动文件或文件夹到上一级目录不会实时同步, 求解决方案
#!/bin/bash
user=root
ip=192.168.0.2
source=/data/
target=/data/
log_path=/var/log/inotifywait.log
inotifywait -mrq ${source} --timefmt '%Y-%m-%d %H:%M:%S' --format '%T %w %f %e' -e create,modify,attrib,move,delete,close_write |
while read files; do
echo "$files" >> ${log_path}
INO_EVENT=$(echo $files | awk '{print $5}')
INO_PATH=$(echo $files | awk '{print $3}')
# 增改查类型
if [[ $INO_EVENT =~ 'CREATE' ]] || [[ $INO_EVENT =~ 'MODIFY' ]] || [[ $INO_EVENT =~ 'CLOSE_WRITE' ]] || [[ $INO_EVENT =~ 'MOVED_TO' ]] || [[ $INO_EVENT =~ 'ATTRIB' ]]
then
# 同步只针对发生改变的文件的目录
rsync -avzcR ${INO_PATH} ${user}@${ip}:${target}
fi
# 删除&移出事件
if [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]]
then
rsync -avzR --delete ${INO_PATH} ${user}@${ip}:${target}
fi
done