服务器上数据定时同步到网络磁盘

背景:由于权限问题无法将网络磁盘直接挂载到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


__EOF__

本文作者skypanxh
本文链接https://www.cnblogs.com/skypanxh/p/18305816.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   skypanxh  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示