使用inotify实现linux系统下的目录变化监控

简介:

近期,有个项目须要及时删除Nginx服务生成的缓存文件,因为不是非常了解Nginx缓存生成的策略,在网上也沒有细致找,经过大家讨论,终于希望引入liunx的inotify功能,监控某个liunx文件夹下的各种事件(create,delete,access等等).
想了解inotify的朋友,请参考下面两篇博文:
1.http://www.ibm.com/developerworks/cn/linux/l-inotify.html使用 inotify 监控 Linux 文件系统事件
2.http://www.ibm.com/developerworks/cn/linux/l-inotifynew/index.htmlinotify -- Linux 2.6 内核中的文件系统变化通知机制

假设看完两篇博文,你的想法是用C语言立即写一个监控文件的程序(我当初也这么想的),先别忙,看看下面的文章,立即向您介绍一下inotify-tools这个工具包,眼下最新版是3.3版本号,这个工具包差点儿包括了文件夹和文件的监控点,也就是说,不用动手写C代码,已经有前人帮我写好了,我们能够直接通过bash脚本的调用完成这个功能.

1、先查看linux的内核是否支持inotify,支持inotify的内核最小为2.6.13,输入命令:uname –a。例如以下图所看到的,内核为2.6.27,应该支持inotify.假设不支持,我建议你选择一个高级别的linux内核.否则应该会有非常多麻烦.

2、还能够通过例如以下命令查看系统是否支持inotify:ll /proc/sys/fs/inotify
假设有例如以下输出,表示系统内核已经支持inotify:
total 0
-rw-r--r-- 1 root root 0 Feb 21 01:15 max_queued_events
-rw-r--r-- 1 root root 0 Feb 21 01:15 max_user_instances
-rw-r--r-- 1 root root 0 Feb 21 01:15 max_user_watches

3.inotify-tools的下载和安装
下载地址:[url]http://downloads.sourceforge.net/inotify-tools/inotify-tools-3.13.tar.gz?modtime=1199213676&big_mirror=0
[/url]
安装过程:略.

4.内部命令介绍
系统下运行命令:man inotify、 man inotifywait、 man inotifywatch就可以得到对应的帮助信息,表示inotify成功安装。

man inotify:
捕获文件系统的各种状态事件

Java代码 收藏代码
inotify events

Bit Description
IN_ACCESS File was accessed (read) (*)
IN_ATTRIB Metadata changed (permissions, timestamps,

               extended attributes, etc.) (*)  

IN_CLOSE_WRITE File opened for writing was closed (*)
IN_CLOSE_NOWRITE File not opened for writing was closed (*)
IN_CREATE File/directory created in watched directory (*)
IN_DELETE File/directory deleted from watched directory (*)
IN_DELETE_SELF Watched file/directory was itself deleted
IN_MODIFY File was modified (*)
IN_MOVE_SELF Watched file/directory was itself moved
IN_MOVED_FROM File moved out of watched directory (*)
IN_MOVED_TO File moved into watched directory (*)
IN_OPEN File was opened (*)

man inotifywait:
等待并监控某个文件夹或文件的状态改变,能够适时的通过liunx脚本等待并监控文件改变的事件,能够在事件发生时退出脚本,也能够在事件发生时输出一些信息.

参数解释:

--fromfile 仅仅监控文件夹下文件状态的变化
-m, --monitor 当事件发生后直接运行退出,-m 参数将不退出当前的shell脚本.
-r, --recursive 递归监控当前文件夹下的全部文件和文件夹.(默认的文件和文件夹数最大是 8192个;假设不满足能够改动/proc/sys/fs/inotify/max_user_watches
--exclude 通过正则匹配文件名称,大写和小写敏感.
--excludei 通过正则匹配文件名称,大写和小写不敏感.
-t 事件发生时的秒数.
-e 监听那些事件的发生
--timefmt option 指定输出的时间格式
--format 输出指定时间格式.

 %w    监控事件发生时的文件名称或文件路径 
 %f    监控文件夹内部事件发生时文件名称称 
 %e 监控指定的事件发生 
 %T    输出事件发生时的时间,--timefmt option指定格式 

inotifywatch:
使用linux的inotify特性监控某段时间内的文件状态,并输出摘要报表.
例子:输出beagle文件夹下60秒内的訪问和改动事件触发报表

Java代码 收藏代码
% inotifywatch -v -e access -e modify -t 60 -r ~/.beagle

   Establishing watches...  
   Setting up watch(es) on /home/rohan/.beagle  
   OK, /home/rohan/.beagle is now being watched.  
   Total of 302 watches.  
   Finished establishing watches, now collecting statistics.  
   Will listen for events for 60 seconds.  
   total  access  modify  filename  
   1436   1074    362     /home/rohan/.beagle/Indexes/FileSystemIndex/PrimaryIndex/  
   1323   1053    270     /home/rohan/.beagle/Indexes/FileSystemIndex/SecondaryIndex/  
   303    116     187     /home/rohan/.beagle/Indexes/KMailIndex/PrimaryIndex/  
   261    74      187     /home/rohan/.beagle/TextCache/  
   206    0       206     /home/rohan/.beagle/Log/  
   42     0       42      /home/rohan/.beagle/Indexes/FileSystemIndex/Locks/  
   18     6       12      /home/rohan/.beagle/Indexes/FileSystemIndex/  
   12     0       12      /home/rohan/.beagle/Indexes/KMailIndex/Locks/  
   3      0       3       /home/rohan/.beagle/TextCache/54/  
   3      0       3       /home/rohan/.beagle/TextCache/bc/  
   3      0       3       /home/rohan/.beagle/TextCache/20/  
   3      0       3       /home/rohan/.beagle/TextCache/62/  
   2      2       0       /home/rohan/.beagle/Indexes/KMailIndex/SecondaryIndex/  

编写自己的监控脚本:
需求:因为使用Nginx的反向代理,生成本地缓存的策略,所以须要监控某个文件夹的新增或删除的变化,并将变化的文件名称称输出到一个LOG中,带后续文件有改动时,能够通过该log定位文件地址,并删除该文件,及时向前端反映文件变更后的变化.
脚本; inodify_cache_list.sh

Java代码 收藏代码

!/bin/sh

A slightly complex but actually useful example

logfile="/opt/data/cache_list.txt"
temp_logfile="/opt/data/cache_tempfile.txt"

/usr/local/bin/inotifywait -mrq --format '%w%f' -e moved_to /opt/data/proxy_cache_dir/| while read file;
do

    echo "/usr/bin/printf \"delete "`grep -a 'KEY:' ${file}| sed -e s/KEY://g;`"\\r\\n\" | nc 127.0.0.1 11211,rm -f "${file} |tee -a $logfile | tee -a $temp_logfile   

done

本文转自博客园知识天地的博客,原文链接:使用inotify实现linux系统下的目录变化监控。 如需转载请自行联系原博主。

相关文章
|
15天前
|
Linux
Linux系统之expr命令的基本使用
【10月更文挑战第18天】Linux系统之expr命令的基本使用
51 4
|
4天前
|
Linux 应用服务中间件 Shell
linux系统服务二!
本文详细介绍了Linux系统的启动流程,包括CentOS 7的具体启动步骤,从BIOS自检到加载内核、启动systemd程序等。同时,文章还对比了CentOS 6和CentOS 7的启动流程,分析了启动过程中的耗时情况。接着,文章讲解了Linux的运行级别及其管理命令,systemd的基本概念、优势及常用命令,并提供了自定义systemd启动文件的示例。最后,文章介绍了单用户模式和救援模式的使用方法,包括如何找回忘记的密码和修复启动故障。
19 5
linux系统服务二!
|
4天前
|
Linux 应用服务中间件 Shell
linux系统服务!!!
本文详细介绍了Linux系统(以CentOS7为例)的启动流程,包括BIOS自检、读取MBR信息、加载Grub菜单、加载内核及驱动程序、启动systemd程序加载必要文件等五个主要步骤。同时,文章还对比了CentOS6和CentOS7的启动流程图,并分析了启动流程的耗时。此外,文中还讲解了Linux的运行级别、systemd的基本概念及其优势,以及如何使用systemd管理服务。最后,文章提供了单用户模式和救援模式的实战案例,帮助读者理解如何在系统启动出现问题时进行修复。
21 3
linux系统服务!!!
|
12天前
|
Web App开发 搜索推荐 Unix
Linux系统之MobaXterm远程连接centos的GNOME桌面环境
【10月更文挑战第21天】Linux系统之MobaXterm远程连接centos的GNOME桌面环境
108 4
Linux系统之MobaXterm远程连接centos的GNOME桌面环境
|
14天前
|
Linux 测试技术 网络安全
Linux系统之安装OneNav个人书签管理器
【10月更文挑战第19天】Linux系统之安装OneNav个人书签管理器
35 5
Linux系统之安装OneNav个人书签管理器
|
13天前
|
运维 监控 Linux
Linux系统之部署Linux管理面板1Panel
【10月更文挑战第20天】Linux系统之部署Linux管理面板1Panel
62 3
Linux系统之部署Linux管理面板1Panel
|
16天前
|
监控 Java Linux
Linux系统之安装Ward服务器监控工具
【10月更文挑战第17天】Linux系统之安装Ward服务器监控工具
38 5
Linux系统之安装Ward服务器监控工具
|
4天前
|
网络协议 Linux
linux系统重要文件目录
本文介绍了Linux系统中的重要目录及其历史背景,包括根目录、/usr、/etc、/var/log和/proc等目录的结构和功能。其中,/etc目录下包含了许多关键配置文件,如网卡配置、DNS解析、主机名设置等。文章还详细解释了各目录和文件的作用,帮助读者更好地理解和管理Linux系统。
16 2
|
5天前
|
Ubuntu Linux Shell
Linux 系统中的代码类型或脚本类型内容
在 Linux 系统中,代码类型多样,包括 Shell 脚本、配置文件、网络配置、命令行工具和 Cron 定时任务。这些代码类型广泛应用于系统管理、自动化操作、网络配置和定期任务,掌握它们能显著提高系统管理和开发的效率。
|
8天前
|
关系型数据库 MySQL Linux
Linux系统如何设置自启动服务在MySQL数据库启动后执行?
【10月更文挑战第25天】Linux系统如何设置自启动服务在MySQL数据库启动后执行?
50 3