inotifywait默认收到首个事件即退出,非bug而是设计;加-m参数可持续监听,配合-r递归监控目录,需注意权限、资源限制及事件后的内容比对。

inotifywait 不能查看“历史”,只能监听“未来发生的修改事件”。它不是日志回溯工具,不记录过去发生了什么,只在你运行它之后才开始捕获事件。想查已发生的修改,得靠 stat、find -mtime 或 Git 等机制;想实时知道“接下来谁改了什么”,inotifywait 才是正解。
inotifywait 监控文件修改时,为什么总是一次就退出?
默认行为就是如此:inotifywait 在收到第一个事件后立即退出。这不是 bug,是设计——它面向脚本集成,由调用方决定是否重试或循环。
- 加
-m参数才能持续监听,比如:inotifywait -m -e modify /path/to/file - 如果监控目录,必须加
-r(递归),否则子目录里的修改完全收不到 - 注意权限:监控路径需有读+执行(
x)权限,否则报错Permission denied - 若用
sudo启动,后续触发的rsync或脚本也得考虑权限上下文,别直接写进用户 crontab
监控多个目录或排除临时文件,参数怎么组合?
inotifywait 不支持一次传入多个路径作为独立监控目标(比如 inotifywait /a /b 会报错),但可以用 shell 循环或合并事件流来变通处理。
- 单目录多排除:用
--excludei配正则,例如--excludei '\.(swp|tmp|log)$'忽略大小写匹配的临时文件 - 多目录分别监控:写成循环,如
for d in /opt/app /var/www; do inotifywait -m -r -e modify,create,delete "$d" & done - 想统一输出格式,必须每个
inotifywait实例都带--timefmt和--format,例如:--timefmt '%Y-%m-%d %H:%M:%S' --format '%T %w%f %e' - 不要用
-q(quiet)和--format同时出现,前者会压制后者输出
为什么监控大目录时提示 “No space left on device”?
这不是磁盘满了,而是内核 inotify 资源耗尽。每个被监控的子目录、文件都会占用一个 watch,而默认上限极低(通常 8192),一万个子目录就能爆掉。
- 临时生效:运行
sudo sysctl -w fs.inotify.max_user_watches=524288 - 永久生效:把
fs.inotify.max_user_watches=524288写进/etc/sysctl.conf,再sudo sysctl -p - 同时检查
max_user_instances(每个用户最多几个 inotify 实例)和max_queued_events(队列长度),批量监控时三者都要调高 - 监控前先用
find /path -type d | wc -l估算子目录数量,避免盲目设太高浪费内存
真正容易被忽略的是:inotify 只告诉你“有东西变了”,但从不告诉你“变成什么样了”。比如 modify 事件发生后,你得自己用 rsync 或 diff 去比对内容差异——它不提供变更前后的快照。


















