inotifywait 必须显式指定 -e create,delete,modify,move,attrib 才不漏事件;rsync 应拆解 -a 为 -rltdv 并慎用 --delete、--checksum;脚本需用 exec 避免子 shell 问题,加 sleep 0.1 和进程检查,并调高 inotify max_user_watches。

inotifywait 监控命令怎么写才不漏事件
默认只监听部分事件,容易漏掉重命名、属性修改等关键操作。必须显式指定 -e 参数组合,否则像 mv 或 chmod 触发的变更不会被捕获。
- 常用完整事件集:
create,delete,modify,move,attrib—— 尤其attrib能捕获权限/时间戳变更,move覆盖重命名和移动 - 避免用
-e all:它会包含大量无用事件(如unmount),反而干扰逻辑或触发误同步 - 加
--exclude仅过滤文件名,不能过滤路径;若要排除子目录(如/logs/),得用--exclude '^/logs/'(注意正则开头锚定) -
--format '%w%f'中的%w是监控路径前缀,%f是相对文件名,拼起来才是完整绝对路径,别漏掉%w
rsync 同步命令里哪些参数影响实时性与安全性
直接套用 rsync -a 很危险:它保留所有元数据,但可能把损坏的临时文件、编辑器锁文件也推过去。实时场景下必须做减法。
PyCharm 2026.2.0.1 Linux版提供 JetBrains 官方 2026.2.0.1 版本安装包,适合需要指定 PyCharm 版本进行 Python 项目开发、运行和调试的用户。
- 去掉
-a,拆解为必要项:-rltDv(递归、符号链接、时间戳、设备文件、详细输出),明确控制行为 - 强制校验加
--checksum:避免因网络抖动导致文件内容错位却没报错,但会显著降低速度,小文件频繁变更时不建议常开 - 禁止删除目标端多余文件:
--delete必须慎用;备份场景下应去掉,或改用--delete-after防止同步中断时误删 - 远程传输必须加
-e "ssh -o ConnectTimeout=5":避免 SSH 挂起阻塞整个管道,超时后自动重试
脚本循环里为什么 rsync 总是卡住或重复执行
根本原因是 inotifywait 输出流被管道传入 while read 后,子 shell 无法继承父进程的信号处理,导致 Ctrl+C 失效、日志混乱、进程残留。
- 用
exec绕过子 shell:exec inotifywait -m ... | while read ...让 while 循环运行在当前 shell 上下文 - 每次 rsync 前加
sleep 0.1:缓解 inotify 高频事件风暴(比如保存一个 Word 文档会触发 10+ 事件),避免瞬间并发多个 rsync - 用
pgrep -f "rsync.*$SOURCE_DIR" | grep -v $$检查是否有旧 rsync 进程残留,有就kill掉再启动新任务 - 日志重定向必须分开:
2>>/var/log/sync.err和>> /var/log/sync.log,否则错误和正常输出混在一起难排查
lsyncd 配置里 delay 和 excludeFrom 的真实作用边界
delay 不是“延迟同步”,而是“合并事件窗口”;excludeFrom 不只是过滤文件名,还决定 rsync 是否跳过整个目录扫描。
-
delay = 3表示:3 秒内发生的全部 inotify 事件打包成一次 rsync 调用,不是等 3 秒再开始同步 -
excludeFrom = "/etc/lsyncd_exclude.lst"文件中写.git/会跳过整个.git目录及其所有子项,比exclude = {".git"}更彻底 - 排除规则不支持通配符嵌套:
**/*.tmp无效,只能写*.tmp或逐行写dir1/*.tmpdir2/*.tmp - 如果源目录下有大量小文件(>10万),
maxProcesses = 1是必须项,否则多个 rsync 并发读同一文件会导致 I/O 错误或内容损坏
/proc/sys/fs/inotify/max_user_watches 默认仅 8192,监控大目录会静默失败。改完要 sysctl -p 生效,且需在 inotifywait 启动前完成,不是脚本里临时 echo 就能覆盖的。










