inotify是Linux内核自2.6.13起提供的文件系统事件监控机制,通过事件驱动方式高效监听文件或目录的变化,支持IN_ACCESS、IN_MODIFY、IN_CREATE等事件类型,相比轮询更节省资源;用户空间可通过inotify-tools工具(如inotifywait)实现对文件变化的实时响应,常用于日志监控、配置文件检测和自动化脚本;使用时需注意默认监控句柄数限制(可通过修改/proc/sys/fs/inotify/max_user_watches调整),仅适用于本地文件系统且不记录事件触发者。

Linux系统中,监控文件变化是一个常见需求,比如日志文件变动、配置文件被修改或代码部署同步等。实现这一功能的核心工具之一是 inotify —— 一个内核子系统,用于监听文件系统的事件,如创建、删除、修改等。
inotify 是什么?
inotify 是 Linux 内核从 2.6.13 版本开始引入的一个机制,它允许应用程序监视文件或目录的事件。相比传统的轮询方式(定期检查文件是否变化),inotify 是事件驱动的,效率更高,资源消耗更少。
常见的 inotify 事件包括:
- IN_ACCESS:文件被访问
- IN_MODIFY:文件内容被修改
- IN_ATTRIB:文件属性改变(如权限、时间戳)
- IN_CREATE:在目录中创建新文件或子目录
- IN_DELETE:文件或目录被删除
- IN_CLOSE_WRITE:以可写模式打开的文件被关闭
- IN_MOVE:文件或目录被移动
使用 inotify-tools 命令行工具
虽然 inotify 是内核提供的功能,但用户空间需要工具来使用它。最常用的工具是 inotify-tools,它提供两个命令:inotifywait 和 inotifywatch。
安装 inotify-tools:
- Ubuntu/Debian: apt install inotify-tools
- CentOS/RHEL: yum install inotify-tools 或 dnf install inotify-tools
使用 inotifywait 监控单个文件:
inotifywait -m /path/to/file.txt参数说明:
- -m:持续监控模式(monitor)
- -e modify,create,delete:只监听指定事件
示例:监控某个目录下的所有变化
inotifywait -m -r -e modify,create,delete /var/log/- -r:递归监控子目录
- -e:指定关注的事件类型
输出示例:
/var/log/ MODIFY access.log表示 access.log 文件被修改。
在脚本中使用 inotify 实现自动响应
你可以结合 shell 脚本,利用 inotifywait 做到文件一变就触发操作,比如自动重启服务、同步文件或发送通知。
示例:当配置文件变化时打印提示
#!/bin/bash
inotifywait -m -e modify /etc/myapp/config.conf |
while read path action file; do
echo "检测到 $path$file 被 $action"
# 可在此处添加 reload 命令
done
这个脚本会一直运行,每当 config.conf 被修改,就会执行 echo 操作。
注意事项与限制
inotify 功能强大,但也有一些使用上的限制:
- 默认监控的句柄数有限(通常 8192),可通过修改 /proc/sys/fs/inotify/max_user_watches 提高上限
- 只能监控本地文件系统,NFS 等网络文件系统支持有限
- 不记录谁触发了事件,仅报告发生了什么
- 软链接本身的变化不会被监听,除非直接监控该链接文件
查看当前系统 inotify 限制:
cat /proc/sys/fs/inotify/max_user_watches临时增加监听数量:
echo 16384 > /proc/sys/fs/inotify/max_user_watches永久生效需写入 /etc/sysctl.conf:
fs.inotify.max_user_watches=16384基本上就这些。通过 inotify,你可以高效地实现对关键文件和目录的实时监控,避免轮询带来的性能浪费。无论是开发调试、运维自动化还是安全审计,都是很实用的技术手段。










