inotify是Linux内核≥2.6.13自带机制,无需启用模块;需安装inotify-tools,用inotifywait -m持续监听,避免管道|while read陷阱,递归监控前须调大max_user_watches。

inotify 不是“配置系统”的功能,而是内核自带的机制,只要 Linux 内核 ≥ 2.6.13(2005 年起几乎所有发行版都满足),它就已启用。真正要做的,是安装用户态工具、合理调用、避开常见陷阱。
确认 inotify 内核支持并安装 inotify-tools
不用手动“开启”内核模块——inotify 是编译进内核的,不是可加载模块。验证是否就绪只需检查:
-
ls /proc/sys/fs/inotify/应输出max_queued_events、max_user_instances、max_user_watches三个文件 -
uname -r输出版本 ≥2.6.13
安装命令按发行版走:
- Debian/Ubuntu:
sudo apt install inotify-tools - RHEL/CentOS 7+:
sudo yum install inotify-tools或sudo dnf install inotify-tools - 若提示找不到包,先启用 EPEL(如
sudo yum install epel-release)
装完就有两个命令:inotifywait(事件阻塞等待)、inotifywatch(统计型监控,少用)。
inotifywait 命令必须加 -m 才能持续监听
这是最常踩的坑:inotifywait 默认是“单次触发”行为——收到第一个事件就退出。不加 -m,脚本跑一次就停,根本做不到“监控”。
- ❌ 错误写法:
inotifywait -e modify /etc/hosts→ 修改一次后进程结束 - ✅ 正确写法:
inotifywait -m -e modify /etc/hosts→ 持续输出每条修改事件 - 搭配
-q可抑制启动提示,让输出更干净 - 注意:
-m和管道| while read组合时有子 shell 陷阱(见下一条)
Shell 脚本里别用 | while read 捕获 inotifywait 输出
看似顺手的写法:inotifywait -m ... | while read file event; do ... done,实际会丢事件、变量失效、信号难处理。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 根本原因:管道右侧是子 shell,
while内部的变量赋值无法回传到父 shell - 更严重的是:如果
do块里执行耗时操作(如rsync、curl),inotifywait的输出缓冲区可能填满或管道阻塞,后续事件直接被丢弃 - ✅ 健壮写法:让
inotifywait单次触发,动作执行完再进下一轮循环
示例(监控 Nginx 配置重载):
#!/bin/bash CONFIG="/etc/nginx/nginx.conf" while inotifywait -e modify "$CONFIG" >/dev/null; do nginx -t && systemctl reload nginx done
这个结构天然避免管道阻塞,也便于加超时(如 timeout 5s nginx -t)或错误处理。
递归监控目录前必须调大 max_user_watches
用 -r 监控一个含上百子目录的路径时,inotifywait 会为每个子目录创建独立 watch。默认 /proc/sys/fs/inotify/max_user_watches 是 8192,极易触达,报错不是磁盘满,而是:
inotifywait: failed to watch /path: No space left on device
- 临时生效:
sudo sysctl fs.inotify.max_user_watches=524288 - 永久生效:写入
/etc/sysctl.conf,追加一行fs.inotify.max_user_watches=524288 - 顺带调一下另两个参数(尤其多进程监控场景):
max_user_instances(默认 128)、max_queued_events(默认 16384) - 注意:这些是 per-user 限制,root 和普通用户各自独立计算
复杂逻辑(如需路径过滤、事件合并、状态保持)建议直接上 pyinotify,而不是硬撑 shell;但对“改个配置 reload 一下”这种需求,inotifywait + 简单 while 循环就是最轻量、最可靠的选择。

















