85 lines
2.7 KiB
Bash
85 lines
2.7 KiB
Bash
#!/bin/bash
|
|
|
|
#############################################################################################
|
|
# 用途: inotify 同步脚本
|
|
# 作者: 丁辉
|
|
# 更新时间: 2024-03-28
|
|
#############################################################################################
|
|
|
|
# rsync 服务端 IP
|
|
HOST=none
|
|
# rsync 用户名
|
|
USER=rsync
|
|
# rsync 密码文件
|
|
PASSWORD=/etc/rsync.pass
|
|
# 同步目录
|
|
SRC=/data/
|
|
# rsync 模块
|
|
Module=data
|
|
# inotifywait 命令
|
|
inotifywait=/usr/bin/inotifywait
|
|
|
|
#### Inotifywait 参数解释
|
|
# -m: 监控目录
|
|
# -r: 递归监控
|
|
# -q: 静默模式
|
|
# --timefmt: 时间格式
|
|
# %Y: 年
|
|
# %m: 月
|
|
# %d: 日
|
|
# %H: 时
|
|
# %M: 分
|
|
# --format: 输出格式
|
|
# %T: 时间
|
|
# %w: 目录
|
|
# %f: 文件
|
|
# %e: 事件
|
|
# %Xe: 扩展事件
|
|
# -e: 监控事件
|
|
# modify: 文件内容修改
|
|
# delete: 文件删除
|
|
# create: 文件创建
|
|
# attrib: 文件属性修改
|
|
# move: 文件移动
|
|
# close_write: 文件关闭写入
|
|
|
|
##### Rsync 参数解释
|
|
# -a: 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD
|
|
# -r: 相对路径传输文件
|
|
# -t: 保持文件时间信息
|
|
# -u: 仅传输更新文件
|
|
# -z: 传输时压缩
|
|
# -v: 详细模式输出
|
|
# -c: 跳过校验算法,仅根据文件时间和大小判断是否同步
|
|
# -P: 保持文件传输进度
|
|
|
|
# 监控目录
|
|
cd $SRC
|
|
|
|
$inotifywait -mrq --timefmt '%Y%m%d %H:%M' --format '%T %w%f %Xe' -e modify,delete,create,attrib,move,close_write ./ \
|
|
| while read files ;do
|
|
# 获取文件路径
|
|
FILE_PWD=$(echo $files | awk '{print $3}')
|
|
# 获取文件事件
|
|
FILE_EVENT=$(echo $files | awk '{print $4}')
|
|
# 在日志内提示时间
|
|
echo ".....................................$(date)....................................."
|
|
|
|
# 增加、修改、写入完成、移动进事件
|
|
if [[ $FILE_EVENT =~ "CREATE" ]] || [[ $FILE_EVENT =~ "MODIFY" ]] || [[ $FILE_EVENT =~ "CLOSE_WRITE" ]] || [[ $FILE_EVENT =~ "MOVED_TO" ]]; then
|
|
rsync -artuz --password-file=${PASSWORD} $(dirname ${FILE_PWD}) ${USER}@${HOST}::${Module}
|
|
fi
|
|
|
|
# 删除、移动事件触发
|
|
if [[ $FILE_EVENT =~ "DELETE" ]] || [[ $FILE_EVENT =~ "MOVED_FROM" ]]; then
|
|
rsync -artuz --password-file=${PASSWORD} $(dirname ${FILE_PWD}) ${USER}@${HOST}::${Module}
|
|
fi
|
|
|
|
# 修改属性事件触发[ touch, chgrp, chmod, chown ]
|
|
if [[ $FILE_EVENT =~ "ATTRIB" ]]; then
|
|
# 判断是否为目录, 如果是目录则不同步(在目录下文件修改属性时, 目录属性也会被修改)
|
|
if [ ! -d "$INO_FILE" ]; then
|
|
rsync -artuz --password-file=${PASSWORD} $(dirname ${FILE_PWD}) ${USER}@${HOST}::${Module}
|
|
fi
|
|
fi
|
|
done |