服务器上数据定时同步到网络磁盘
背景:由于权限问题无法将网络磁盘直接挂载到HPC上,但是可以挂载到本地,解决思路是通过rsyncd进行同步,每次同步的时候都将网络磁盘挂载到本地。我想把服务器上/home/s222552331/LUTO2_XH/Custom_runs/下的文件同步到网络磁盘的z/LUF-Modelling/LUTO2_XH/LUTO2/output
一、Window本地操作
1. 下载并安装cwRsyncServer
下载地址:https://github.com/foxuc/Windows/releases/
安装到:C:\Program Files (x86)\ICW
可任意更改
2. 配置本地Rsync
a.编写配置文件
rsyncd.conf
内容
port = 端口号
use chroot = false
strict modes = false
hosts allow = *
log file = C:/Program Files (x86)/ICW/rsyncd.log
uid = 0
gid = 0
[luto]
path = /cygdrive/z/LUF-Modelling/LUTO2_XH/LUTO2/output
read only = false
transfer logging = yes
auth users = ruser
secrets file = C:/Program Files (x86)/ICW/rsyncd.secrets
说明:
- port = Rsync服务使用的端口号。
- use chroot = false:是否使用chroot,设置为false表示不使用chroot。
- strict modes = false:严格模式设置,设置为false表示不检查文件权限。
- hosts allow = :允许连接的主机,可以使用IP地址或主机名,表示允许所有主机。
- log file = C:/Program Files (x86)/ICW/rsyncd.log:日志文件路径。
- uid = 0:运行Rsync服务的用户ID,0表示root用户。
- gid = 0:运行Rsync服务的组ID,0表示root组。
- [luto]:共享模块名称。
- path = /cygdrive/z/LUF-Modelling/LUTO2_XH/LUTO2/output:共享目录路径。
- read only = false:设置为false表示允许写操作。
- transfer logging = yes:是否记录传输日志。
- auth users = ruser:授权用户列表,多个用户用逗号分隔。
- secrets file = C:/Program Files (x86)/ICW/rsyncd.secrets:认证用户的密码文件路径。内容为
ruser:密码
b. 编写挂载磁盘并启动Rsync的脚本并开启端口
start_rsync.bat
内容:
net use 网络磁盘ip /user:用户名 密码
"C:\Program Files (x86)\ICW\bin\rsync.exe" --daemon --config="C:\Program Files (x86)\ICW\rsyncd.conf"
netsh advfirewall firewall add rule name="Open Port 端口号" dir=in action=allow protocol=TCP localport=端口号
echo
说明:
- net use z: \网络磁盘ip\共享文件夹 /user:用户名 密码:挂载网络磁盘到本地Z盘。
- "C:\Program Files (x86)\ICW\bin\rsync.exe" --daemon --config="C:\Program Files (x86)\ICW\rsyncd.conf":启动Rsync服务。
- 可以将该脚本设置为开机自动运行
二、HPC服务器上操作
0. 安装rsync
一般HPC上都带的有,如果没有需要自己安装,无安装权限需联系管理员
(安装方法)
sudo apt-get install rsync # 对于Ubuntu
# 或
sudo yum install rsync # 对于CentOS
1. 创建同步脚本
sync_files.sh
内容:
#!/bin/bash
# 定义日志文件及其备份目录
LOG_FILE="/home/s222552331/rsync/rsync_log.txt"
BACKUP_DIR="/home/s222552331/rsync/backup_logs"
MAX_LOG_DAYS=7
# 创建备份目录(如果不存在)
mkdir -p $BACKUP_DIR
# 检查日志文件是否存在并且超过 MAX_LOG_DAYS 天
if [ -f $LOG_FILE ]; then
LOG_FILE_AGE=$(find $LOG_FILE -mtime +$MAX_LOG_DAYS)
if [ ! -z "$LOG_FILE_AGE" ]; then
TIMESTAMP=$(date +%Y%m%d%H%M%S)
mv $LOG_FILE $BACKUP_DIR/rsync_log_$TIMESTAMP.txt
fi
fi
# 使用 flock 确保脚本的唯一实例
exec 200>/var/lock/sync_files.lock || exit 1
flock -n 200 || exit 1
# 定义上次同步的时间标记文件
LAST_SYNC_FILE="/home/s222552331/rsync/last_sync_time.txt"
# 如果上次同步时间标记文件不存在,创建它并设置为一个很早的时间
if [ ! -f $LAST_SYNC_FILE ]; then
echo "1970-01-01 00:00:00" > $LAST_SYNC_FILE
fi
# 读取上次同步时间
LAST_SYNC_TIME=$(cat $LAST_SYNC_FILE)
# 日志开始时间
echo "Sync started at: $(date)" >> $LOG_FILE
# 查找自上次同步以来修改或新增的文件,并生成相对路径的文件列表
find /home/s222552331/LUTO2_XH/Custom_runs/ -type f -newermt "$LAST_SYNC_TIME" | sed 's|^/home/s222552331/LUTO2_XH/Custom_runs/||' > /home/s222552331/rsync/file_list.txt
# 同步文件,日志中只记录传输的文件
rsync -av --files-from=/home/s222552331/rsync/file_list.txt --relative --progress --port=8873 --password-file=/home/s222552331/rsync/rsync_password --log-file=$LOG_FILE /home/s222552331/LUTO2_XH/Custom_runs/ ruser@10.148.155.15::luto
# 检查 rsync 命令的退出状态
if [ $? -eq 0 ]; then
# 如果 rsync 成功,更新上次同步时间到当前时间
date '+%Y-%m-%d %H:%M:%S' > $LAST_SYNC_FILE
echo "Sync finished at: $(date)" >> $LOG_FILE
else
# 如果 rsync 失败,记录错误信息但不更新上次同步时间
echo "Sync failed at: $(date)" >> $LOG_FILE
fi
说明:
sync_files.sh脚本首先定义了日志文件及其备份目录,然后创建备份目录(如果不存在)。接下来,检查日志文件是否存在且超过最大保存天数(7天),如果是,则将其备份。使用 flock 命令确保脚本的唯一实例运行,防止多个同步进程同时运行导致冲突。定义并读取上次同步的时间标记文件,如果文件不存在,则创建并设置为一个很早的时间(1970年)。记录同步开始时间,查找自上次同步以来修改或新增的文件,并生成相对路径的文件列表。使用 rsync 命令同步文件,记录传输的文件到日志文件。最后,检查 rsync 命令的退出状态,如果成功,更新上次同步时间到当前时间;如果失败,记录错误信息但不更新上次同步时间。
- LOG_FILE="/home/s222552331/rsync/rsync_log.txt":定义日志文件路径。
- BACKUP_DIR="/home/s222552331/rsync/backup_logs":定义日志文件备份目录。
- MAX_LOG_DAYS=7:日志文件保存的最大天数。
- mkdir -p $BACKUP_DIR:创建备份目录(如果不存在)。
- 检查日志文件是否存在并且超过 MAX_LOG_DAYS 天。
- 使用 flock 确保脚本的唯一实例。(定时运行可能会上一次同步位完成下一次同步开始)
- 定义上次同步的时间标记文件 LAST_SYNC_FILE。
- 如果上次同步时间标记文件不存在,创建它并设置为一个很早的时间。
- 读取上次同步时间 LAST_SYNC_TIME。
- 查找自上次同步以来修改或新增的文件,并生成相对路径的文件列表。
- 同步文件,日志中只记录传输的文件。
- rsync_password文件自己创建,内写windoew上rsyncd.secrets中的密码
- 检查 rsync 命令的退出状态,如果成功,更新上次同步时间到当前时间;如果失败,记录错误信息但不更新上次同步时间。
2.定期运行脚本
编辑crontab文件:
crontab -e
添加以下内容以每小时运行一次同步脚本:
0 * * * * /home/s222552331/rsync/sync_files.sh