inotifywait+rsync是最轻量可控的实时备份组合,因它基于内核事件驱动、无轮询延迟、精准响应文件落盘变更;而crontab定时扫描存在高延迟、io毛刺大、无法区分未保存修改等缺陷。

inotifywait + rsync 是实现目录变更自动备份最轻量、最可控的组合。它不依赖轮询,也不需要常驻服务管理器,只要内核支持 inotify 就能实时响应。
为什么不用 crontab 定时扫描?
定时扫描(比如每分钟 find + md5sum)有明显缺陷:延迟高、IO 毛刺大、无法区分“改了但没保存”和“已落盘”的状态。而 inotifywait 监听的是内核事件,文件写入完成瞬间就触发,且只在真正有变更时才动作。
必须处理的三个关键陷阱
实际部署中,90% 的失败都来自以下三点:
-
inotifywait默认只监听一级子目录,递归需加-m -r,漏掉-r就等于没监听 - 编辑器(如 vim、nano)保存时会先写临时文件再 rename,必须监听
CREATE、MOVED_TO、MODIFY三类事件,只盯MODIFY会丢变更 -
rsync同步时若目标正在被读取(比如日志分析脚本正tail -f),可能因文件锁或忙状态失败,需加--ignore-errors或重试逻辑
一个可直接用的最小可行脚本
保存为 /usr/local/bin/watch-and-backup.sh,内容如下(注意替换 SOURCE 和 DEST):
#!/bin/bash SOURCE="/home/user/docs" DEST="/backup/docs" LOG="/var/log/watch-backup.log" <h1>确保目标存在</h1><p>mkdir -p "$DEST"</p><div class="aritcle_card flexRow artxards"> <div class="artcardd flexRow"> <a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill3817" title="onewo-rtlinux"><img src="https://img.php.cn/upload/skill/000/000/081/178980860444696.jpg" alt="onewo-rtlinux" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a rel="nofollow" href="/xiazai/skill3817" title="onewo-rtlinux" class="overflowclass">onewo-rtlinux</a> <p class="overflowclass">Linux 实时编程助手。生成、审查并修改用于周期性控制任务和中断驱动程序的 C 代码。强制实施实时调度策略。</p> </div> <a rel="nofollow" href="/xiazai/skill3817" title="onewo-rtlinux" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div><h1>监听并同步(-m 持续监听,-r 递归,-e 指定事件类型)</h1><p>inotifywait -m -r -e CREATE,MOVED_TO,MODIFY,DELETE "$SOURCE" 2>/dev/null | \ while read path action file; do echo "$(date): $action $file" >> "$LOG"</p><h1>避免高频触发叠加,每次只跑一次 rsync</h1><p>/usr/bin/rsync -a --delete --ignore-errors "$SOURCE/" "$DEST/" >> "$LOG" 2>&1 done</p>
赋予执行权限:chmod +x /usr/local/bin/watch-and-backup.sh
手动运行测试:/usr/local/bin/watch-and-backup.sh &,然后在 $SOURCE 下新建/修改文件,检查 $DEST 是否实时更新、$LOG 是否有对应记录。
如何让脚本开机自启且稳定驻留
不要用 nohup ... & 或塞进 .bashrc——它们随终端关闭或用户登出而终止。正确做法是交给 systemd 管理:
- 创建服务文件:
/etc/systemd/system/watch-backup.service - 内容需包含
Type=simple、Restart=always、User=root(若同步涉及 root 权限路径) - 最关键的是加
ExecStartPre=/bin/sh -c 'mkdir -p /backup/docs',避免服务启动时目标目录不存在导致失败 - 启用服务:
sudo systemctl daemon-reload && sudo systemctl enable --now watch-backup.service
检查状态:sudo systemctl status watch-backup.service,看是否 active (running) 且无 failed 日志。
真正难的不是监听本身,而是处理“编辑器 rename 行为”“rsync 中途 IO 错误”“服务意外退出后无感知”这三类静默失效场景。每个环节都要有日志落盘、有状态反馈、有兜底重试,否则所谓“自动”,只是把问题从显性变成了黑盒。










