在 Ubuntu(以及其它 Linux 发行版)上,inotify 失效通常并不是 inotify 本身坏了,而是使用方式或系统限制导致“看起来没反应”。下面按常见原因 → 现象 → 解决办法来说明。
ENOSPC: System limit for number of file watchers reached
inotify 有系统级 watcher 数量限制。
查看当前限制:
cat /proc/sys/fs/inotify/max_user_watches
sudo sysctl fs.inotify.max_user_watches=524288
echo 'fs.inotify.max_user_watches=524288' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
很多程序(如 vim、sed -i、某些日志轮转)是:
你监听的是旧 inode,所以失效。
IN_MOVED_TO / IN_CREATE 事件inotify 只能在本地文件系统生效,不支持:
--privileged事件产生速度 > 消费速度,内核丢弃事件。
查看:
cat /proc/sys/fs/inotify/max_queued_events
sudo sysctl fs.inotify.max_queued_events=1048576
read()IN_MODIFY 但文件是 IN_CLOSE_WRITEinotifywait 但参数写错示例(正确):
inotifywait -m -e modify,attrib,close_write /path
r-x--cap-add SYS_ADMIN# 1. 当前 watcher 数量
cat /proc/sys/fs/inotify/max_user_watches
# 2. 实际使用情况
find /proc/*/fd -lname anon_inode:inotify 2>/dev/null | wc -l
# 3. 测试 inotify 是否工作
inotifywait -m /tmp/test
如果你能告诉我:
我可以直接帮你定位到具体哪一项导致失效。