当前位置: 首页 > news >正文

树莓派搭建NAS之五:数据同步

数据同步

由于使用的是32GU盘作为nas存储盘,用不了几天就会出现磁盘空间被占满的情况,需要将nas中存储的录像记录,同步存储到阿里云盘中,并且删除历史的视频释放空间。

定时任务

直接通过ai写一个shell脚本,定时执行就完事了。给ai提出诉求:

  • 将源端文件存在、目标端不存在的文件进行同步
  • 仅比较文件文件大小,不比较时间和md5值(阿里网盘不允许修改文件时间)
  • 启动定时任务,1小时执行1次

新建/opt/sync_xiaomi_camera.sh 文件:

#!/bin/bash# =============================================
# 小米摄像头视频同步脚本(带磁盘清理)
# 功能:自动清理源端旧文件 + 同步新文件
# 作者:AI 助手
# =============================================# -------------------------------
# 配置区
# -------------------------------# 源目录(小米摄像头存储路径)
SOURCE_DIR="/srv/dev-disk-by-uuid-0987bf77-xxxxx/smb_xiaomi_vidoes/XiaomiCamera_00_xxxxx"# 目标目录(如阿里云盘挂载点)
DEST_DIR="/mnt/aliyun/XiaomiCamera_00_xxxxx"# 日志文件
LOG_FILE="/var/log/sync_xiaomi_camera.log"# 网络检测目标
PING_TARGET="223.5.5.5"
TIMEOUT=5# 磁盘清理阈值(百分比)
DISK_USAGE_THRESHOLD_HIGH=70    # 超过此值开始清理
DISK_USAGE_THRESHOLD_LOW=50     # 清理到此值以下停止# -------------------------------
# 日志函数
# -------------------------------log() {echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG_FILE"
}# -------------------------------
# 检查网络连通性
# -------------------------------check_network() {log "INFO: 正在检测网络连通性,目标: $PING_TARGET"if command -v ping >/dev/null 2>&1; thenif ping -c 2 -W $TIMEOUT "$PING_TARGET" >/dev/null 2>&1; thenlog "INFO: 网络连通性检测成功"return 0elselog "ERROR: ping 到 $PING_TARGET 失败"return 1fielselog "WARNING: 未安装 ping,尝试使用 curl 检测..."fiif command -v curl >/dev/null 2>&1; thenif curl -m $TIMEOUT --head --silent --fail "http://alidns.com" >/dev/null 2>&1; thenlog "INFO: curl 检测成功,网络可达"return 0elselog "ERROR: curl 检测失败,无法访问外网"return 1fielselog "ERROR: 未安装 curl 或 ping,无法检测网络"return 1fi
}# -------------------------------
# 检查挂载点
# -------------------------------check_mounts() {local mount1=$(findmnt -n -o TARGET /mnt/aliyun)local mount2=$(findmnt -n -o TARGET /srv/dev-disk-by-uuid-0987bf77-xxxxx)if [ -z "$mount1" ]; thenlog "ERROR: /mnt/aliyun 未挂载"return 1fiif [ -z "$mount2" ]; thenlog "ERROR: /srv/dev-disk-by-uuid-... 未挂载"return 1filog "INFO: 所有挂载点已就绪"return 0
}# -------------------------------
# 清理源端磁盘空间(自动删除最老文件)
# -------------------------------cleanup_source_disk() {local mount_point=$(dirname "$SOURCE_DIR")if [ ! -d "$mount_point" ]; thenlog "ERROR: 源挂载点不存在: $mount_point"return 1fi# 获取当前磁盘使用率local current_usagecurrent_usage=$(df -P "$mount_point" | tail -1 | awk '{print $5}' | tr -d '%')if ! [[ "$current_usage" =~ ^[0-9]+$ ]]; thenlog "ERROR: 无法获取磁盘使用率"return 1filog "INFO: 当前源磁盘使用率: ${current_usage}% (阈值: >${DISK_USAGE_THRESHOLD_HIGH}% 开始清理,<${DISK_USAGE_THRESHOLD_LOW}% 停止)"if [ $current_usage -le $DISK_USAGE_THRESHOLD_HIGH ]; thenlog "INFO: 磁盘使用率正常,跳过清理"return 0filog "WARN: 磁盘使用率过高 (${current_usage}% > ${DISK_USAGE_THRESHOLD_HIGH}%),开始清理旧文件..."local deleted_count=0# 按修改时间升序(最老的在前)删除 .mp4 文件while IFS= read -r file; do[ ! -f "$file" ] && continuelocal filename=$(basename "$file")log "INFO: 删除旧文件: $filename"if rm -f "$file"; then((deleted_count++))log "INFO: 已删除: $filename"elselog "ERROR: 删除失败: $filename"continuefi# 重新检查磁盘使用率current_usage=$(df -P "$mount_point" | tail -1 | awk '{print $5}' | tr -d '%')if ! [[ "$current_usage" =~ ^[0-9]+$ ]]; thenlog "ERROR: 获取磁盘使用率失败,停止清理"breakfilog "INFO: 删除后磁盘使用率: ${current_usage}%"# 如果已降到 50% 以下,停止if [ $current_usage -le $DISK_USAGE_THRESHOLD_LOW ]; thenlog "INFO: 磁盘使用率已降至 ${current_usage}% ≤ ${DISK_USAGE_THRESHOLD_LOW}%,停止清理"breakfidone < <(find "$SOURCE_DIR" -type f -name "*.mp4" -printf '%T@ %p\n' | sort -n | cut -d' ' -f2-)log "INFO: 共清理 $deleted_count 个旧文件"
}# -------------------------------
# 执行同步(基于文件名+大小)
# -------------------------------sync_files() {if [ ! -d "$SOURCE_DIR" ]; thenlog "ERROR: 源目录不存在: $SOURCE_DIR"return 1fimkdir -p "$DEST_DIR"log "INFO: 开始同步所有 .mp4 文件(基于文件名+大小判断)"log "INFO: 源目录: $SOURCE_DIR"log "INFO: 目标目录: $DEST_DIR"START_TIME=$(date +%s)# 核心同步命令:只同步 .mp4,仅根据大小判断是否传输OUTPUT=$(rsync -rtv --size-only \--include='*.mp4' \--exclude='*' \--info=progress2,stats2 \"$SOURCE_DIR/" "$DEST_DIR/" 2>&1)RSYNC_EXIT_CODE=$?echo "$OUTPUT" | tee -a "$LOG_FILE"END_TIME=$(date +%s)DURATION=$((END_TIME - START_TIME))HOURS=$((DURATION / 3600))MINUTES=$(((DURATION % 3600) / 60))SECONDS=$((DURATION % 60))ELAPSED_TIME=$(printf "%02d:%02d:%02d" $HOURS $MINUTES $SECONDS)FILES_TRANSFERRED=$(echo "$OUTPUT" | grep "Number of files transferred" | awk '{print $4}' || echo 0)TOTAL_BYTES=$(echo "$OUTPUT" | grep "Total bytes sent" | awk '{print $4}' || echo 0)if [ $RSYNC_EXIT_CODE -eq 0 ]; thenlog "INFO: 同步成功"elselog "ERROR: rsync 执行失败,退出码: $RSYNC_EXIT_CODE"filog "INFO: 任务开始时间: $(date -d "@$START_TIME" '+%Y-%m-%d %H:%M:%S')"log "INFO: 任务结束时间: $(date -d "@$END_TIME" '+%Y-%m-%d %H:%M:%S')"log "INFO: 总耗时: $ELAPSED_TIME"log "INFO: 成功同步文件数量: $FILES_TRANSFERRED"log "INFO: 传输总大小(字节): $TOTAL_BYTES"log "------------------------------------------------------------"
}# -------------------------------
# 主函数
# -------------------------------main() {log "=== 新的同步任务启动 ==="# 1. 清理源端磁盘(如果使用率 >70%)cleanup_source_disk# 2. 检查网络if ! check_network; thenlog "ERROR: 网络不可达,跳过本次同步"log "------------------------------------------------------------"exit 1fi# 3. 检查挂载if ! check_mounts; thenlog "ERROR: 挂载点未就绪,跳过同步"log "------------------------------------------------------------"exit 1fi# 4. 执行同步sync_files
}# -------------------------------
# 创建日志目录并执行
# -------------------------------LOG_DIR=$(dirname "$LOG_FILE")
[ ! -d "$LOG_DIR" ] && mkdir -p "$LOG_DIR"main "$@"

添加到crontab中

crontab -e

添加以下任务

0 * * * * bash /opt/sync_xiaomi_camera.sh

查看结果

tail -f /var/log/sync_xiaomi_camera.log

显示结果为:

[2025-10-03 12:40:06] === 新的同步任务启动 ===
[2025-10-03 12:40:06] INFO: 当前源磁盘使用率: 23% (阈值: >70% 开始清理,<50% 停止)
[2025-10-03 12:40:06] INFO: 磁盘使用率正常,跳过清理
[2025-10-03 12:40:06] INFO: 正在检测网络连通性,目标: 223.5.5.5
[2025-10-03 12:40:07] INFO: 网络连通性检测成功
[2025-10-03 12:40:07] INFO: 所有挂载点已就绪
[2025-10-03 12:40:08] INFO: 开始同步所有 .mp4 文件(基于文件名+大小判断)
[2025-10-03 12:40:08] INFO: 源目录: /srv/dev-disk-by-uuid-0987bf77-xxxxx/smb_xiaomi_vidoes/XiaomiCamera_00_xxxxx
[2025-10-03 12:40:08] INFO: 目标目录: /mnt/aliyun/XiaomiCamera_00_xxxxx
sending incremental file list0   0%    0.00kB/s    0:00:00 (xfr#0, to-chk=0/45)Number of files: 45 (reg: 44, dir: 1)
Number of created files: 0
Number of deleted files: 0
Number of regular files transferred: 0
Total file size: 5,905,580,032 bytes
Total transferred file size: 0 bytes
Literal data: 0 bytes
Matched data: 0 bytes
File list size: 0
File list generation time: 0.001 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 2,058
Total bytes received: 148sent 2,058 bytes  received 148 bytes  4,412.00 bytes/sec
total size is 5,905,580,032  speedup is 2,677,053.50
[2025-10-03 12:40:08] INFO: 同步成功
[2025-10-03 12:40:08] INFO: 任务开始时间: 2025-10-03 12:40:08
[2025-10-03 12:40:08] INFO: 任务结束时间: 2025-10-03 12:40:08
[2025-10-03 12:40:08] INFO: 总耗时: 00:00:00
[2025-10-03 12:40:08] INFO: 成功同步文件数量: 
[2025-10-03 12:40:08] INFO: 传输总大小(字节): 2,058
[2025-10-03 12:40:08] ------------------------------------------------------------
http://www.zskr.cn/news/15188.html

相关文章:

  • 深入解析:Coze源码分析-资源库-编辑插件-后端源码-安全与错误处理
  • 详细介绍:【读书笔记】《C陷阱与缺陷》第4章:连接问题解析 | 避开多文件编译的坑
  • 质数表
  • 2025波形护栏厂家 TOP 企业品牌推荐排行榜,山东波形护栏防撞,三波,二波,双波,喷塑,公路,热浸锌,浸塑,镀锌波形护栏公司推荐!
  • US$458 Car Key Clamp SN-CP-JJ-01 for SEC-E9 CNC Automated Key Cutting Machine
  • 好数
  • 2025防火皮革厂家TOP企业品牌推荐排行榜,B1级防火皮革,建筑防火皮革,审讯室防火皮革,邮轮级防火皮革,软包防火皮革公司推荐
  • MySQL 全量 + 增量备份脚本(RPM 安装)实践与疑问解析
  • 2025磁选机厂家TOP企业品牌推荐排行榜,立环磁选机,高梯度磁选机,立环高梯度磁选机,油冷立环磁选机公司推荐
  • 2025最新编织袋生产厂家推荐排行榜:涵盖牛皮纸、塑料、PP 彩膜等品类,助力企业精准甄选可靠合作伙伴
  • 详细介绍:鸿蒙与iOS跨平台开发方案全解析
  • US$58 HU162T Clamp Work on VW SN-CP-JJ-16 Work with SEC-E9 Key Cutting Machine
  • 完整教程:Linux中安装es
  • 251003
  • 学习项目movie-web:构建本地电影、电视视频中心 - 教程
  • AT_abc205_e [ABC205E] White and Black Balls
  • Rust Slint库达成桌面萌宠源码分享(包含拖动、右键菜单效果)
  • Redis 持久化机制 - 教程
  • glazewm_windows平铺窗口管理器使用方法
  • 树莓派搭建NAS之三:使用OpenList挂载网盘
  • 数哈多应用授权系统如何为Go语言编程开发者给予知识产权保护?
  • 完整教程:华为eNSP环境安装和命令使用教程
  • 分布式架构初识:为什么需要分布式 - 教程
  • [IOI 1998 / USACO2.2] 派对灯 Party Lamps 题解 + bitset浅谈
  • 2025 --【J+S 二十连测】-- 第一套 总结
  • 【实验报告】华东理工大学随机信号处理实验报告 - 详解
  • Docker部署配置全流程(超详细——Windows和Linux) - 指南
  • AT_abc309_g [ABC309G] Ban Permutation
  • 在Mac上运行Windows 365的完整指南
  • 完整教程:华为海思正式进入Wi-Fi FEM赛道?