Liuqichun's Blog

Linux|inotifywait 异步文件系统监控机制

异步文件系统监控机制,可以用来监听文件夹、文件的属性或内容变更的事件。

Inotify 一种强大的、细粒度的、异步文件系统监控机制,它满足各种各样的文件监控需要,可以监控文件系统的访问属性、读写属性、权限属性、删除创建、移动等操作,也就是可以监控文件发生的一切变化。

inotify-tools 是一个 C 库和一组命令行工具,提供 Linux 下 inotify 的简单接口。inotify-tools 安装后会得到 inotifywait 和 inotifywatch 这两条命令:

开始之前需要检测系统内核是否支持 inotify:

使用 uname -r 命令检查 Linux 内核,如果低于 2.6.13,就需要重新编译内核加入 inotify 的支持。

使用 ll /proc/sys/fs/inotify 命令,是否有以下三条信息输出,如果没有表示不支持。

1ll /proc/sys/fs/inotify
2total 0
3-rw-r--r-- 1 root root 0 Jan  4 15:41 max_queued_events
4-rw-r--r-- 1 root root 0 Jan  4 15:41 max_user_instances
5-rw-r--r-- 1 root root 0 Jan  4 15:41 max_user_watches

安装 inotify-tools

方式一:

1#CentOS release 5.8/64位:
2tar zxvf inotify-tools-3.14.tar.gz
3cd inotify-tools-3.14
4./configure
5make
6make install

其他 Linux 发行版安装方法可以参见:https://github.com/rvoicilas/inotify-tools/wiki#wiki-getting

方式二:使用 yum 工具安装

1yum install -y inotify-tools

inotify 相关参数

inotify 定义了下列的接口参数,可以用来限制 inotify 消耗 kernel memory 的大小。由于这些参数都是内存参数,因此,可以根据应用需求,实时的调节其大小:

根据以上在 32 位或者 64 位系统都可以执行:

1echo 104857600 > /proc/sys/fs/inotify/max_user_watches
2echo 'echo 104857600 > /proc/sys/fs/inotify/max_user_watches' >> /etc/rc.local

如果遇到以下错误:

1inotifywait: error while loading shared libraries: libinotifytools.so.0: cannot open shared object file: No such file or directory
1 **解决方法:**
232位系统:ln -s /usr/local/lib/libinotifytools.so.0 /usr/lib/libinotifytools.so.0
364位系统:ln -s /usr/local/lib/libinotifytools.so.0 /usr/lib64/libinotifytools.so.0

inotifywait 命令使用

 1#!/bin/bash
 2#filename watchdir.sh
 3path=$1
 4/usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y/%H:%M' --format '%T %w %f' -e modify,delete,create,attrib $path
 5
 6执行输出:
 7./watchdir.sh /data/wsdata/tools/
 804/01/13/16:34 /data/wsdata/tools/ .j.jsp.swp
 904/01/13/16:34 /data/wsdata/tools/ .j.jsp.swx
1004/01/13/16:34 /data/wsdata/tools/ .j.jsp.swx
1104/01/13/16:34 /data/wsdata/tools/ .j.jsp.swp
1204/01/13/16:34 /data/wsdata/tools/ .j.jsp.swp
1304/01/13/16:34 /data/wsdata/tools/ .j.jsp.swp
1404/01/13/16:34 /data/wsdata/tools/ .j.jsp.swp
1504/01/13/16:34 /data/wsdata/tools/ .j.jsp.swp
1604/01/13/16:35 /data/wsdata/tools/ 4913
1704/01/13/16:35 /data/wsdata/tools/ 4913
1804/01/13/16:35 /data/wsdata/tools/ 4913
1904/01/13/16:35 /data/wsdata/tools/ j.jsp
2004/01/13/16:35 /data/wsdata/tools/ j.jsp
2104/01/13/16:35 /data/wsdata/tools/ j.jsp
2204/01/13/16:35 /data/wsdata/tools/ j.jsp~
2304/01/13/16:35 /data/wsdata/tools/ .j.jsp.swp

inotifywait 命令参数

可监听的事件

事件 描述
access 访问 ,读取文件。
modify 修改 ,文件内容被修改。
attrib 属性 ,文件元数据被修改。
move 移动 ,对文件进行移动操作。
create 创建 ,生成新文件
open 打开 ,对文件进行打开操作。
close 关闭 ,对文件进行关闭操作。
delete 删除 ,文件被删除。

可以通过 inotifywait --help 查看详细事件。

案例

我们知道 nginx 能够缓存网站静态资源,当我们重新部署网站后,静态资源就被更新了,此时需要让 nginx 重新 reload 一下。这种场景就可以用到 inotifywait 命令,监听网站静态资源文件夹的变化,然后重新 reload nginx。

注意:当监听文件夹时,内部的文件变化会触发事件,并且对同一个文件重新写入会触发多个事件,但要保证 nginx 不能过多 reload。

1#!/bin/sh
2# 监听博客变更,然后重新加载nginx配置
3
4inotifywait -mq -e create "/data/blog/" | grep -c "/data/blog/ ATTRIB,ISDIR" | while read ret ; do
5    if [[ ret > 0 ]]; then
6    	nginx -s reload
7        echo "nginx 重新加载配置"
8    fi
9done

<< Previous Post

|

Next Post >>