背景与目标
| 项目 | 内容 |
|---|---|
| 源端 | Linux(6个业务项目) |
| 目标端 | Windows + Cygwin(rsync服务) |
| 同步内容 | 各业务 uploads/files/ 目录下的文件 |
| 核心目标 | 只同步当前月份目录,减少日志量 |
#!/bin/bash
# ==================== 频率控制逻辑 ====================
current_hour=$(date +%H)
current_min=$(date +%M | sed 's/^0//')
if [ $current_hour -ge 7 ] && [ $current_hour -lt 20 ]; then
if [ $((current_min % 5)) -ne 0 ]; then
exit 0
fi
else
if [ $current_min -ne 0 ]; then
exit 0
fi
fi
# ==================== 频率控制结束 ====================
# ==================== 变量定义 ====================
LOG_FILE="/var/log/rsynclog/rsync.log"
RSYNC_OPTS="--progress -avz --delete --itemize-changes"
LOG_OPTS="--log-file=${LOG_FILE} --log-file-format='%t %f %b'"
PORT="--port=18883"
DEST="cwrsync@111.111.111.111"
WEBAPPS_DIR="/usr/local/tomcat/apache-tomcat-9.0.88/webapps"
# ==================== 获取当前年月 ====================
YEAR=$(date +%Y) # 2026
MONTH=$(date +%-m) # 7 (无前导零)
# ==================== 项目与模块映射 ====================
declare -A PROJECTS=(
["lssjapi"]="backup_lssj"
["tzwlapi"]="backup_tzwl"
["lsyhapi"]="backup_lsyh"
["lsjnapi"]="backup_lsjn"
["tzjjapi"]="backup_tzjj"
["lsqyapi"]="backup_lsqy"
)
echo "$(date '+%Y-%m-%d %H:%M:%S') ========== 开始同步 =========="
# ==================== 遍历同步 ====================
for project in "${!PROJECTS[@]}"; do
module="${PROJECTS[$project]}"
# 源端路径:/usr/local/.../lssjapi/uploads/files/2026/7
src_path="${WEBAPPS_DIR}/${project}/uploads/files/${YEAR}/${MONTH}"
# 检查当月目录是否存在
if [ ! -d "${src_path}" ]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') [SKIP] ${project} - 目录不存在: ${src_path}"
continue
fi
echo "$(date '+%Y-%m-%d %H:%M:%S') [START] ${project} -> ${module}"
# 同步命令
# 源:.../lssjapi/uploads/files/2026/7/ 下的所有内容
# 目标:cwrsync@111.111.111.111::backup/2026/7/
rsync ${RSYNC_OPTS} ${LOG_OPTS} ${PORT} \
"${src_path}/" \
${DEST}::${module}/${YEAR}/${MONTH}/
if [ $? -eq 0 ]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') [SUCCESS] ${project} 同步完成"
else
echo "$(date '+%Y-%m-%d %H:%M:%S') [ERROR] ${project} 同步失败,退出码: $?"
fi
echo ""
done
echo "$(date '+%Y-%m-%d %H:%M:%S') ========== 同步结束 =========="{/collapse-item}
{collapse-item label="目标端 Windows rsyncd.conf"}
# ==================== 全局配置 ====================
uid = 0
gid = 0
use chroot = false
strict modes = false
hosts allow = *
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
port = 18883
max connections = 10
dont compress = *.gz *.bz2 *.tgz *.zip *.rar *.z
# ==================== 模块定义 ====================
[backup_lssj]
path = /cygdrive/d/linux_sync/lssj/files
read only = false
transfer logging = no
max verbosity = 1
lock file = rsyncd.lock
auth users = cwrsync
secrets file = etc/cwrsync.passwd
[backup_tzwl]
path = /cygdrive/d/linux_sync/tzwl/files
read only = false
transfer logging = no
max verbosity = 1
lock file = rsyncd.lock
auth users = cwrsync
secrets file = etc/cwrsync.passwd
[backup_lsyh]
path = /cygdrive/d/linux_sync/lsyh/files
read only = false
transfer logging = no
max verbosity = 1
lock file = rsyncd.lock
auth users = cwrsync
secrets file = etc/cwrsync.passwd
[backup_lsjn]
path = /cygdrive/d/linux_sync/lsjn/files
read only = false
transfer logging = no
max verbosity = 1
lock file = rsyncd.lock
auth users = cwrsync
secrets file = etc/cwrsync.passwd
[backup_tzjj]
path = /cygdrive/d/linux_sync/tzjj/files
read only = false
transfer logging = no
max verbosity = 1
lock file = rsyncd.lock
auth users = cwrsync
secrets file = etc/cwrsync.passwd
[backup_lsqy]
path = /cygdrive/d/linux_sync/lsqy/files
read only = false
transfer logging = no
max verbosity = 1
lock file = rsyncd.lock
auth users = cwrsync
secrets file = etc/cwrsync.passwd{/collapse-item}
{collapse-item label="最终目录映射"}
源端 目标端
─────────────────────────────────────────────────────────
.../lssjapi/uploads/files/2026/7/ → D:/linux_sync/lssj/files/2026/7/
.../tzwlapi/uploads/files/2026/7/ → D:/linux_sync/tzwl/files/2026/7/
.../lsyhapi/uploads/files/2026/7/ → D:/linux_sync/lsyh/files/2026/7/
.../lsjnapi/uploads/files/2026/7/ → D:/linux_sync/lsjn/files/2026/7/
.../tzjjapi/uploads/files/2026/7/ → D:/linux_sync/tzjj/files/2026/7/
.../lsqyapi/uploads/files/2026/7/ → D:/linux_sync/lsqy/files/2026/7/{/collapse-item}
{collapse-item label="端模块对应关系"}
| 脚本中项目 | 目标端模块名 | 目标端路径 |
|---|---|---|
| lssjapi | backup_lssj | /cygdrive/d/linux_sync/lssj/files |
| tzwlapi | backup_tzwl | /cygdrive/d/linux_sync/tzwl/files |
| lsyhapi | backup_lsyh | /cygdrive/d/linux_sync/lsyh/files |
| lsjnapi | backup_lsjn | /cygdrive/d/linux_sync/lsjn/files |
| tzjjapi | backup_tzjj | /cygdrive/d/linux_sync/tzjj/files |
| lsqyapi | backup_lsqy | /cygdrive/d/linux_sync/lsqy/files |
{/collapse-item}
{collapse-item label="验证"}
验证所有业务目录是否同步成功
# 查看所有模块的 2026/7/ 目录
for module in backup_lssj backup_tzwl backup_lsyh backup_lsjn backup_tzjj backup_lsqy; do
echo "=== $module ==="
rsync --port=18883 --list-only cwrsync@111.111.111.111::$module/2026/7/ 2>/dev/null | head -5
done
查看同步日志
# 查看最近同步记录
tail -50 /var/log/rsynclog/rsync.log
配置定时任务
crontab -e
添加:
* * * * * /root/rsync_sh/sync_ls_all.sh >> /var/log/rsynclog/sync_all.log 2>&1
查看定时任务是否生效
# 查看当前 crontab
crontab -l
# 等待1-2分钟后查看日志
tail -f /var/log/rsynclog/sync_all.log常用命令
# 查看模块列表
rsync --port=18883 cwrsync@111.111.111.111::
# 查看某模块目录
rsync --port=18883 --list-only cwrsync@111.111.111.111::backup_lssj/2026/7/
# 手动同步
rsync -avz --port=18883 --delete 源路径/ cwrsync@111.111.111.111::模块名/2026/7/
# 查看日志
tail -f /var/log/rsynclog/rsync.log
# 查看定时任务
crontab -l
# Windows端重启rsync服务
net stop RsyncServer && net start RsyncServer{/collapse-item}
评论 (0)