Skip to content

Inotify事件监控工具

Inotify 是 Linux 内核提供的一种高效文件系统事件监控机制,用于实时检测文件或目录的变化(如创建、修改、删除等)。

核心特性

  • 实时性:通过内核主动推送事件,避免轮询的资源消耗

  • 细粒度监控:支持多种事件类型(如 IN_CREATEIN_MODIFYIN_DELETE 等),可精确到单个文件或目录

  • 低开销:基于文件描述符接口,兼容 select/poll/epoll 等 I/O 多路复用机制

使用场景

  • 文件同步:如结合 rsync 实现实时备份

  • 日志监控:实时跟踪日志文件更新

  • 自动化脚本:触发文件变动后的自定义操作(如重新加载配置)

inotify服务搭建

安装

bash
# Debian/Ubuntu
sudo apt install inotify-tools
# RHEL/CentOS
sudo yum install inotify-tools

语法格式

inotifywait 是 Linux 下基于 inotify 机制的文件系统监控工具,属于 inotify-tools 软件包的一部分。它可以阻塞式地等待文件系统事件(如文件创建、修改、删除等),非常适合用于编写自动化脚本。

bash
inotifywait [-hcmrq] [-e <event>] [-t <seconds>] [--format <fmt>] [--timefmt <fmt>] <file> [<file> ...]

选项

选项描述示例
-h显示帮助信息inotifywait -h
-m持续监控模式(不退出)inotifywait -m /tmp
-r递归监控目录inotifywait -r /var/log
-q减少冗余输出inotifywait -q /home
-e <event>指定监控的事件类型inotifywait -e create,delete /tmp
-t <seconds>设置超时时间(秒)inotifywait -t 60 /opt
--format <fmt>自定义输出格式inotifywait --format '%T %w%f' /tmp
--timefmt <fmt>设置时间格式inotifywait --timefmt '%Y-%m-%d' /tmp
--exclude <pattern>大小写敏感的正则表达式排除模式inotifywait -r --exclude '^/tmp/backup' /tmp
--excludei <pattern>大小写不敏感的正则表达式排除模式inotifywait -r --excludei '\.log$' /var
--fromfile <file>从文件读取排除模式(每行一个)inotifywait -r --fromfile exclude_list.txt /data

--format占位符

占位符描述示例输出
%w监控的目录路径/tmp
%f触发事件的文件名(目录事件为空)test.log
%e事件类型(多个事件用逗号分隔)CREATE,MODIFY
%T当前时间(需配合--timefmt使用)2025-06-12 14:30:00

--timefmt占位符

参数说明示例输出
%Y4位年份2025
%y2位年份25
%m月份(01-12)06
%d日期(01-31)13
%H小时(00-23)15
%M分钟(00-59)30
%S秒(00-59)45
%A星期全称Friday
%a星期缩写Fri
%B月份全称June
%b月份缩写Jun
%F等价于 %Y-%m-%d2025-06-13
%T等价于 %H:%M:%S15:30:45
%Z时区CST
%z时区偏移+0800
%sUnix时间戳(秒)176543210
%N纳秒(需高精度支持)123456789

-e <event>事件

事件名称描述
access文件或目录被读取
modify文件内容被修改(目录的修改时间变化)
attrib文件或目录的元数据(权限、所有者、时间戳等)被修改
move文件或目录被移动(源目录触发)
move_to文件或目录被移动到监控目录(目标目录触发)
create在监控目录内创建新文件或子目录
open文件或目录被打开
close文件或目录被关闭(无论读写模式)
delete文件或目录被删除
umount包含监控项目的文件系统被卸载

经典案例

bash
# 监控关键文件操作(创建/修改/删除/移动)
inotifywait -e create,modify,delete,move /important/files

# 监控权限变更和属性修改
inotifywait -e attrib /sensitive/data

# 持续监控目录变化
inotifywait -mrq --timefmt '%Y/%m/%d %H:%M' --format '%T %w%f %e' -e create,modify,delete /path/to/dir

# 监控/tmp目录下的文件创建和删除事件
inotifywait -m -e create,delete /tmp

# 带时间戳的监控输出
inotifywait -m --format '%T %w%f %e' --timefmt '%F %T' /data/logs

# 递归监控/data但排除所有.git目录
inotifywait -mr --exclude '/\.git/' /data

# 监控网站目录但排除缓存和临时文件(不区分大小写)
inotifywait -mr --excludei '(cache|temp)' /var/www

# 使用排除列表文件监控
echo -e "*.tmp\n*.bak\n/tmp/old/" > exclude.txt
inotifywait -mr --fromfile exclude.txt /home/user

配合rsync脚本

shell
#!/bin/bash
# filename: rsync_inotify.sh
# author: chenhuan
# version: 1.0
# date: 2025-06-13 20:29:07
# description: 时间监听同步文件
#   后台运行:nohup /bin/sh /opt/rsync_inotify.sh > /dev/null 2>&1 &

# 定义同步目录
SYNC_DIR="/data"
# 定义密码文件
PWD_FILE="/etc/rsyncd.passwd"
# 同步服务器IP
BACKUP_SERVER="192.168.148.203"
# 用户名
USER="rsync_backup"
# 模块
MODULE="backup"

inotifywait -mrq --timefmt '%Y-%m-%d %H:%M' --format '%T#%w%f' -e create,modify,move "$SYNC_DIR" | while read -r line; do
  action_date=$(echo "$line" | awk -F"#" '{print $1}')
  action_file=$(echo "$line" | awk -F"#" '{print $2}')
  echo "[$action_date] $action_file" >>/var/log/rsync_inotify.log
  if [[ -f "$action_file" ]]; then
    rsync -avz "$action_file" "$USER"@"$BACKUP_SERVER"::"$MODULE" --password-file="$PWD_FILE"
    # 执行同步操作
  else
    cd "$action_file" && rsync -avz ./ "$USER"@"$BACKUP_SERVER"::"$MODULE" --password-file="$PWD_FILE"
  fi
done

内核优化

bash
# max_user_watches:设置inotifywait或inotifywatch命令可以监视的文件数量(单进程)
# max_user_instances:设置每个用户可以运行的inotifywait或inotifywatch命令的进程数
# max_queued_events:设置inotify实例事件(event)队列可容纳的事件数量。
cat >> /etc/sysctl.conf << EOF
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
EOF
sysctl -p

Inotify 的优缺点

优点

  1. 高效实时
    • 基于内核事件驱动,无轮询开销(对比 cronstat 轮询)。
    • 延迟极低(毫秒级响应)。
  2. 细粒度监控
    • 支持多种事件类型(如文件创建、修改、删除、权限变更等)。
    • 可监控单个文件或整个目录树。
  3. 低资源占用
    • 通过文件描述符管理,适合高并发场景。
    • 内核直接推送事件,减少用户态-内核态切换。
  4. 兼容性
    • 支持 select/poll/epoll 多路复用,易于集成到现有程序。

缺点

  1. 内核依赖
    • 需要 Linux 内核 ≥ 2.6.13(旧系统需升级)。
    • 部分嵌入式设备可能不支持。
  2. 资源限制
    • 默认监控文件数有限(通过 /proc/sys/fs/inotify/max_user_watches 调整)。
    • 大量监控目标时可能耗尽内存或文件描述符。
  3. 事件丢失风险
    • 内核队列溢出时可能丢失事件(需调整 max_queued_events)。
    • 不保证事件的顺序性。
  4. 递归监控复杂
    • 需手动处理子目录的创建/删除事件(对比 fanotify 的自动递归)。

与其他监控工具对比

工具原理实时性递归监控适用场景缺点
Inotify内核事件驱动⭐⭐⭐⭐需手动文件同步、日志监控、配置热更新依赖内核版本,事件可能丢失
Fanotify内核事件驱动(更强大)⭐⭐⭐⭐自动安全审计、恶意软件防护需要 root 权限,配置复杂
Polling(如 stat 轮询)定期检查文件状态⭐⭐支持兼容性要求高的简单场景高延迟,高 CPU 开销
Auditd内核审计框架⭐⭐⭐支持安全合规、入侵检测性能开销大,配置复杂
eBPF + kprobes动态内核追踪⭐⭐⭐⭐支持深度性能分析、调试学习曲线陡峭,需高版本内核