非结构化文件同步-rclone copy标准脚本-实时监控-限制流量-控制并行-批量自动化

支撑非结构化文件同步场景
1.单个脚本指定文件系统的文件路径数据同步到另一个文件系统的另一个路径下
2.按序执行多个不同文件路径的同步任务


单个任务脚本,每十秒钟展示一次执行进度,日志会存储到指定文件夹下

nohup \
rclone copy \
'system1:/mingliao/dataset1' \
'system2:/mingliao/dataset1' \
-v  \
--transfers 4 \
--stats 10s \
--stats-one-line \
--bwlimit=50M:off \
--log-file /home/admin/rclone-v1.69.2-linux-amd64/logs/rclone-dataset1-20250808.log \
&> /dev/null &

批量脚本「满足多个不同路径下的传输任务场景」

#!/bin/bash

# 批量Rclone复制脚本
# 使用方法:./batch_rclone.sh <任务列表文件>

# 检查参数
if [ $# -ne 1 ]; then
    echo "使用方法: $0 <任务列表文件>"
    echo "任务列表文件格式: 每行包含源路径和目标路径,用空格或制表符分隔"
    exit 1
fi

TASK_FILE="$1"
LOG_DIR="/home/admin/rclone-v1.69.2-linux-amd64/logs"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
GLOBAL_LOG="${LOG_DIR}/batch_rclone_${TIMESTAMP}.log"

# 创建日志目录
mkdir -p "$LOG_DIR"

# 检查任务文件是否存在
if [ ! -f "$TASK_FILE" ]; then
    echo "错误: 任务文件 $TASK_FILE 不存在" | tee -a "$GLOBAL_LOG"
    exit 1
fi

# 默认Rclone参数(可根据需要修改)(transfers是并发数,stats是统计频次)
RCLONE_OPTIONS="-v --transfers 4 --stats 10s --stats-one-line --bwlimit=50M:off"

# 函数:执行单个复制任务
execute_task() {
    local source_path="$1"
    local dest_path="$2"
    local task_id="$3"
    
    # 生成任务特定的日志文件名「这块可以按照自己的需求指定每个任务的日志」
    local log_file="${LOG_DIR}/rclone_task_${task_id}_${TIMESTAMP}.log"
    
    echo "$(date): 开始任务 $task_id: 从 $source_path 复制到 $dest_path" | tee -a "$GLOBAL_LOG"
    
    # 执行rclone copy命令
    nohup rclone copy "$source_path" "$dest_path" $RCLONE_OPTIONS --log-file "$log_file" &
    local pid=$!
    
    # 等待任务完成
    wait $pid
    local status=$?
    
    if [ $status -eq 0 ]; then
        echo "$(date): 任务 $task_id 完成" | tee -a "$GLOBAL_LOG"
    else
        echo "$(date): 任务 $task_id 失败,退出代码: $status" | tee -a "$GLOBAL_LOG"
        echo "请查看详细日志: $log_file" | tee -a "$GLOBAL_LOG"
    fi
    
    return $status
}

# 主循环:读取任务文件并执行
task_count=0
completed_count=0
failed_count=0

echo "$(date): 开始批量处理,任务文件: $TASK_FILE" | tee -a "$GLOBAL_LOG"

while IFS= read -r line; do
    # 跳过空行和注释行(以#开头的行)
    if [[ -z "$line" || "$line" =~ ^[[:space:]]*# ]]; then
        continue
    fi
    
    # 从行中提取源路径和目标路径
    source_path=$(echo "$line" | awk '{print $1}')
    dest_path=$(echo "$line" | awk '{print $2}')
    
    if [[ -z "$source_path" || -z "$dest_path" ]]; then
        echo "错误: 无效的任务行: $line" | tee -a "$GLOBAL_LOG"
        continue
    fi
    
    task_count=$((task_count + 1))
    
    # 执行任务
    execute_task "$source_path" "$dest_path" "$task_count"
    if [ $? -eq 0 ]; then
        completed_count=$((completed_count + 1))
    else
        failed_count=$((failed_count + 1))
    fi
    
done < "$TASK_FILE"

# 输出摘要
echo "$(date): 批量处理完成" | tee -a "$GLOBAL_LOG"
echo "总任务: $task_count, 成功: $completed_count, 失败: $failed_count" | tee -a "$GLOBAL_LOG"
echo "全局日志: $GLOBAL_LOG" | tee -a "$GLOBAL_LOG"

执行批量脚本策略

配置任务文件
源地址 目标地址 任务序号「序号可有可无」

执行任务脚本
nohup sh batch_rclone.sh task_20250829 &

task_20250829文件格式内容「多个参数使用空格或者tab分割」

filesystem1:/mingliao/dataset1	filesystem2:/mingliao/dataset1	task1
filesystem1:/mingliao/dataset2	filesystem2:/mingliao/dataset2	task2

单个rclone任务日志的样子

2025/08/26 16:37:37 INFO  : 202410/20241001/RADI_15M_GRB_1KM_BABJ_202410010645.nc: Copied (new)
2025/08/26 16:37:42 INFO  :   727.428 MiB / 1.059 TiB, 0%, 26.711 MiB/s, ETA 11h32m14s (xfr#28/10042)
2025/08/26 16:37:43 INFO  : 202410/20241001/RADI_15M_GRB_1KM_BABJ_202410010700.nc: Copied (new)
2025/08/26 16:37:46 INFO  : 202410/20241001/RADI_15M_GRB_1KM_BABJ_202410010730.nc: Copied (new)

批量脚本的执行情况日志

Fri Aug 29 09:07:00 CST 2025: 开始批量处理,任务文件: task_20250829_ycdy-5km-202508
Fri Aug 29 09:07:00 CST 2025: 开始任务 1: 从 filesystem1:/mingliao/dataset1 复制到 filesystem2:/mingliao/dataset1 task1
Fri Aug 29 09:08:31 CST 2025: 任务 1 完成
Fri Aug 29 09:08:31 CST 2025: 开始任务 2: 从 filesystem1:/mingliao/dataset2 复制到 filesystem2:/mingliao/dataset1 task2
Fri Aug 29 09:09:49 CST 2025: 任务 2 完成
posted @ 2025-08-29 15:47  mingliao17  阅读(18)  评论(0)    收藏  举报