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

Linux下rsync + inotify 实时文件同步方案

一、核心组件概述

1. inotify

inotify是 Linux 内核提供的文件系统变化监控机制,inotify-tools是用户态工具,用于持续监控文件或目录的数据变化(增删改)。

  • 监控事件:create、delete、modify、move、attrib 等

  • 常用命令:inotifywait

  • 特点:事件驱动,无需轮询,性能高

2. rsync

rsync是一款高效的文件数据同步与传输工具

对比项

cp

rsync

跨节点

❌(需 scp)

✅ 原生支持远程同步

数据传输

全量拷贝

差异(增量)同步

压缩传输

✅ 默认/可选压缩

断点续传

权限/软链保留

有限

✅ 丰富参数支持

rsync 默认采用差异同步算法:只传输源与目标之间发生变化的数据块。


二、rsync 差异同步原理简述

假设源文件 A、目标文件 B,rsync 会:

  1. 比对文件块 checksum

  2. 仅传输存在差异的数据块

  3. 在目标端重组文件

纯文本

纯文本

A 文件(源) B 文件(目标) a 1 a 1 b 7 b 7 c 3 ──差异同步──▶ 仅同步 c/e/f 变更块 d 4 d 4 e 99 ← 修改 f 66 ← 修改

结果:不需要全量拷贝,仅同步变动部分,节省带宽与时间。


三、rsync + inotify 组合原理

text

text

inotify 监控目录变化 │ ▼ 事件触发 │ ▼ rsync 增量同步 │ ▼ 目标端数据保持一致

Shell 脚本逻辑:

bash

bash

inotifywait -mrq --format '%w%f' -e modify,create,delete,move /src \ | while read file; do rsync -az --delete /src/ remote:/dst/ done
  • inotifywait:阻塞监听文件事件

  • 一旦触发 → 调用rsync执行增量同步

  • 实现准实时、跨节点数据同步


四、rsync 清空目录的特殊用法

rsync 的同步目标是“使目标 == 源”,因此可利用空目录快速清空目标目录:

bash

bash

# 创建一个空目录 mkdir /tmp/empty # 将空目录同步到 /data ,达到清空 /data 的效果 rsync -a --delete /tmp/empty/ /data/

⚠️ 生产环境慎用--delete,建议先--dry-run测试


五、rsync 常见使用场景示例

1. 本地同步

bash

bash

rsync -avz /data/logs/ /backup/logs/

2. 跨节点同步(SSH)

bash

bash

rsync -avz /data/ root@node2:/data/

3. 作为守护进程(rsync server)

bash

bash

rsync -avz /data/ rsync_backup@backup::data_module

4. 结合 inotify 实时同步脚本示例

bash

bash

#!/bin/bash SRC=/data/wwwroot/ DEST=root@node2:/data/wwwroot/ INOTIFY_CMD="inotifywait -mrq -e modify,create,delete,move $SRC" $INOTIFY_CMD | while read dir event file; do rsync -az --delete $SRC root@node2:/data/wwwroot/ done

六、rsync 常用参数说明

参数

含义

-a

归档模式(递归+保留权限/时间/软链等)

-v

显示过程

-z

传输时压缩

-r

递归

--delete

目标比源多出的文件删除(镜像同步)

--exclude

排除指定文件

--bwlimit

限速(KB/s)

-P

显示进度 + 断点续传

--dry-run

模拟运行


七、典型应用场景总结

  • ✅ 网站代码实时同步(发布机 → 业务节点)

  • ✅ 日志集中收集

  • ✅ 灾备数据增量同步

  • ✅ 替代 scp 做大数据传输

  • ✅ 配合 inotify 实现准实时文件分发

http://www.gsyq.cn/news/1501330.html

相关文章:

  • 手把手复现:用Python仿真5G/WiFi 6中的相位噪声与CPE补偿(附完整代码)
  • 向量数据库中的过滤近似最近邻搜索技术解析
  • 荣昌全屋整装哪家好?2026年本地供应厂家综合实力分析 - 优质品牌商家
  • Redis 从入门到精通:Python 操作 Redis 进阶
  • Spring Boot项目里用Netty手搓MQTT客户端,从连接、订阅到消息重发,一个完整Demo的踩坑实录
  • 京东面试官问:Agent成本突然翻倍查谁
  • 神州控股发布AI共创计划,构建供应链AI轻量化落地新路径
  • 告别GRACE低分辨率:手把手教你用GNSS2TWS开源MATLAB工具箱反演高精度陆地水储量
  • 基于51单片基于51单片机的恒温控制自动报警加热系统(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_可以扫码或者私信
  • 深度解析edge-tts WebSocket连接故障:架构优化与性能调优指南
  • 计算机毕业设计之基于 hadoop 的电影数据分析系统的设计与实现
  • 期货量化尾盘没清仓:天勤 trading_time 过滤与收盘前平仓
  • Time-TK框架:多尺度时间序列预测的创新实践
  • 别再让模型‘虚胖’了:手把手教你用SCConv模块给ResNet50‘瘦身’(附PyTorch代码)
  • [智能体-353]:langchain有哪些自带的skills和tools
  • 双击即用的C++学生信息管理工具:单链表+文件持久化+多条件检索
  • 免费开源三维建模软件MicMac:从照片到三维模型的完整指南
  • KiTTY:Windows上最贴心的SSH客户端,让你的远程连接体验飞起来
  • 如何彻底解决TranslucentTB开机自启动问题:终极体验优化指南
  • 告别手工MIRO/MIR7:用Python脚本调用SAP BAPI实现发票批量冲销与删除
  • ABAQUS粘弹性边界模拟:用Python脚本一键提取节点反力并自动施加(附完整源码)
  • 如何解决老旧Windows系统更新问题:LegacyUpdate完整指南
  • 如何用BoilR一键整合多平台游戏库:终极Steam游戏管理指南
  • 用Spark GraphX处理社交网络数据:一个学生成绩关系图的完整分析实战
  • 告别VGA大块头!用FPGA驱动ST7789V小屏,做个便携示波器界面(附Verilog源码)
  • 基于OpenCV与预训练Keras模型的实时人脸情绪识别工具包(含七类情绪检测+完整运行代码)
  • LinkSwift:突破网盘限速的终极开源解决方案
  • 从“Hello World”到流水线:用Python模拟一个五段式CPU,理解指令执行背后的时钟与数据流
  • Make Sense:浏览器端零安装的图像标注神器终极指南
  • STM32F103C8T6最小系统板直连OLED屏的Keil可运行工程(含SSD1306/SH1106驱动源码)