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

news/2025/10/3 12:49:53/文章来源:https://www.cnblogs.com/liulongtao/p/19124518

数据同步

由于使用的是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.mzph.cn/news/925909.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

初识文件管理

一个文件有哪些属性 文件名:同一个目录下不允许有重名文件。 标识符:一个系统内的个文件标识符唯一,对用户来说毫无可读性。主要用于让操作系统区分 类型:指明文件的类型 位置:文件存放的路径(用户可见),在外存…

微信社群机器人搭建 教程/开发

微信社群机器人搭建 教程/开发 个微API服务能处理用户微信中的各种事件,并辅助微信执行各种操作,提供了开发者与个人号对接的能力,是一款基于微信提供的个人号开放性API,使用简单,操作快捷,支持多种微信方式接入…

深入解析:Coze源码分析-资源库-编辑插件-后端源码-安全与错误处理

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

网站右侧虚代码家具设计培训

填充书架 dp[ i ] 放下第i 本书的最小高度 递推公式&#xff1a;要放第 i 本书的时候 假定前面有 j 本书在书架上&#xff0c;j<i &#xff0c;【 j - i 】之间的书作为最上层的&#xff0c;算出最上层书的最小层数 本题的目的是划分成多个子数组&#xff0c;这类问题&a…

2025 年激光粒度仪厂家 TOP 企业品牌推荐排行榜,电位仪 / 纳米粒度及 Zeta 电位仪 / Zeta 电位仪公司推荐

引言在颗粒测量领域,激光粒度仪作为关键检测设备,其性能直接影响产品质量把控与科研数据准确性。当前市场上仪器品牌繁杂,产品质量参差不齐,不少企业和科研机构在选购时面临诸多难题:部分仪器测量精度不足,数据重…

微信智能机器人开发-基于WTAPI框架,实现强大的个微管理

微信智能机器人开发-基于WTAPI框架,实现强大的个微管理 机器人接口开发:框架提供了开放接口,可以通过这些接口对微信进行操作。如接收用户消息、发送消息、操作朋友圈等。 自然语言处理:机器人需要能够理解自然语言…

网站开发原始数据12345律师免费咨询

RS485是一种常见的通讯接口方式&#xff0c;在我们的实际产品中也是多次使用。但我们平常并不会去过多考虑某一实现的细节问题&#xff0c;不过最近我们遇到了一个因如上下拉电阻的选择问题而造成的通讯故障&#xff0c;所以在这一片中我们来讨论一下RS485总线上下拉电阻的选择…

【AI时代速通QT】第七节:Visual Studio+Qt 开发指南 - 详解

【AI时代速通QT】第七节:Visual Studio+Qt 开发指南 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Conso…

企业网站代建设用微信公众平台做分类广告网站

系列文章目录 AI全栈工程师&#xff08;本文&#xff09; 文章目录 系列文章目录一、前言二、面试题1. 基础理论与数据处理2. 机器学习3. 深度学习4. 大模型与迁移学习5. 计算机视觉6. 自然语言处理&#xff08;NLP&#xff09;7. 多模态学习8. AI生成内容&#xff08;AIGC&am…

电视网站后台管理系统漏洞精准营销方式有哪些

数据工具 分列的其他运用&#xff1a;身份证号中“出生日期”切片&#xff1a;分列→固定宽度→下一步→切割出三列→下一步→不导入第一列→导入第二列且转换成日期→不导入第三列→完成 删除重复值&#xff1a;定位到要“数据”选项卡→删除重复项→取消全选再勾选要删除的…

临沂做网站推广的公司东莞网络营销全网推广

简介 网神防火墙是一款由中国知名网络安全公司启明星辰开发的防火墙产品。它提供了全面的网络安全防护功能,旨在保护企业网络免受各种网络威胁和攻击。 该产品存在用户账号信息泄露漏洞,通过构造特定数据包,获取防火墙管理员登录的账号密码。 漏洞复现 FOFA语法: body=&…

php实验报告企业网站开发做网站优化用什么软件

Golang 是一门号称从语言层面支持并发的编程语言&#xff0c;支持并发是 Golang 一个非常重要的特性。在上一篇文章《44 | 协程&#xff1a;更轻量级的线程》中我们介绍过&#xff0c;Golang 支持协程&#xff0c;协程可以类比 Java 中的线程&#xff0c;解决并发问题的难点就在…

2025粒度仪厂家 TOP 企业品牌推荐排行榜,粒度分析仪,喷雾,激光,纳米,在线,图像粒形,干湿两用粒度仪公司推荐

引言在颗粒表征技术愈发关键的当下,粒度仪已成为金属粉、非金属矿粉、医药、化工等多个领域不可或缺的检测设备。然而,市场上粒度仪品牌与产品层出不穷,质量与性能参差不齐,给企业和科研机构的选购带来了诸多困扰。…

详细介绍:【读书笔记】《C陷阱与缺陷》第4章:连接问题解析 | 避开多文件编译的坑

详细介绍:【读书笔记】《C陷阱与缺陷》第4章:连接问题解析 | 避开多文件编译的坑pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; fon…

Kafka 安全SASL 认证全栈实战从 JAAS 到 Kerberos、PLAIN、SCRAM、OAUTH 与委托令牌 - 教程

Kafka 安全SASL 认证全栈实战从 JAAS 到 Kerberos、PLAIN、SCRAM、OAUTH 与委托令牌 - 教程2025-10-03 12:31 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !importa…

glibc堆

堆的概述 在内存管理领域,glic通过brk和mmap两大系统调用,构建了一套高效的堆内存管理机制。层级化架构,包含分配区(Arena) 堆(Heap) 内存块(Chunk). 主Arena依赖brk系统调用实现内存分配,而子Arena通过mmap完…

幻影图片一键制作网站成武县建设局网站

1.控制同一语句的多次执行2.减少多次的数据转换3.杜绝不必要的子查询和连接表&#xff0c;子查询在执行计划一般解释成外连接&#xff0c;多余的连接表带来额外的开销。4.合并对同一表同一条件的多次UPDATE&#xff0c;比如 UPDATE EMPLOYEE SET FNAMEHAIWER WHERE EMP_ID VPA3…

完整教程:从 “T+1” 到 “秒级”:MySQL+Flink+Doris 构建实时数据分析全链路

完整教程:从 “T+1” 到 “秒级”:MySQL+Flink+Doris 构建实时数据分析全链路pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-f…

平均数

题目大意 平均数 给定长度为 \(n\) 的非负整数序列 \(a_1,a_2,\cdots,a_n\),问有多少个区间 \([l,r](1\le l\le r\le n)\) 满足 \(a_l,a_{l+1},\cdots,a_{r}\) 的平均数为给定非负整数 \(k\)。 思路 发现直接维护平均…

质数表

每个量级取前 50 个。 1e2 - 1e6 数表1e2 1e3 1e4 1e5 1e6101 1009 10007 100003 1000003103 1013 10009 100019 1000033107 1019 10037 100043 1000037109 1021 10039 100049 1000039113 1031 10061 100057 100008112…