当前位置: 首页 > 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.hskmm.com/?act=detail&tid=23511

相关文章:

  • 初识文件管理
  • 微信社群机器人搭建 教程/开发
  • 2025 年激光粒度仪厂家 TOP 企业品牌推荐排行榜,电位仪 / 纳米粒度及 Zeta 电位仪 / Zeta 电位仪公司推荐
  • 微信智能机器人开发-基于WTAPI框架,实现强大的个微管理
  • 2025粒度仪厂家 TOP 企业品牌推荐排行榜,粒度分析仪,喷雾,激光,纳米,在线,图像粒形,干湿两用粒度仪公司推荐
  • glibc堆
  • 完整教程:从 “T+1” 到 “秒级”:MySQL+Flink+Doris 构建实时数据分析全链路
  • 平均数
  • 质数表
  • 小作业 11
  • 深入解析:【RabbitMQ】原理解析
  • 一次insert插入多条数据比insert循环插入数据效率高多少?
  • 内存映射文件
  • 详细介绍:Java安全“幽灵”:深入剖析内存马的原理、注入与查杀
  • 2025波形护栏厂家 TOP 企业品牌推荐排行榜,山东波形护栏防撞,三波,二波,双波,喷塑,公路,热浸锌,浸塑,镀锌波形护栏公司推荐!
  • 好数
  • 2025.10 做题记录
  • 页面分配策略
  • 2025防火皮革厂家TOP企业品牌推荐排行榜,B1级防火皮革,建筑防火皮革,审讯室防火皮革,邮轮级防火皮革,软包防火皮革公司推荐
  • 最强AI图片变视频工具,无内容限制,偷偷下载收藏
  • 2025年电子设备行业最受欢迎的5款CRM推荐
  • 2025年铝板厂家TOP企业品牌推荐排行榜,1060铝板,1100铝板,3003铝板,3004铝板,5052铝板,5083铝板,6061铝板,6063铝板,6082铝板公司推荐!
  • 2025年防撞软包厂家TOP企业品牌推荐排行榜,询问室,幼儿园,B1墙板,防撞软包门防火墙板,阻燃墙板,防撞软包家具,桌椅,马桶,洗手盆公司推荐
  • HTTP 错误 403.14 - Forbidden Web 服务器被配置为不列出此目录的内容——错误代码:0x00000000 - 教程
  • 2025年防撞软包厂家TOP企业品牌推荐排行榜,谈话室,留置病房,教育中心,体育馆,约谈室,监察机构,墙体,阻燃,醒酒室,墙面,洽谈室,留置室,防撞软包洽谈桌公司推荐
  • MySQL 全量 + 增量备份脚本(RPM 安装)实践与疑问解析
  • 2025最新展会搭建公司推荐排行榜:服务商创意定制与全流程服务能力深度解析
  • 10 3
  • 2025磁选机厂家TOP企业品牌推荐排行榜,立环磁选机,高梯度磁选机,立环高梯度磁选机,油冷立环磁选机公司推荐
  • 医疗设备厂家不要再盲选了,专业的医疗DMS经销商管理软件来了!