使用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:
捕获文件系统的各种状态事件
- 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 <file> 仅仅监控文件夹下文件状态的变化
-m, --monitor 当事件发生后直接运行退出,-m 参数将不退出当前的shell脚本.
-r, --recursive 递归监控当前文件夹下的全部文件和文件夹.(默认的文件和文件夹数最大是 8192个;假设不满足能够改动/proc/sys/fs/inotify/max_user_watches
--exclude <pattern> 通过正则匹配文件名称,大写和小写敏感.
--excludei <pattern> 通过正则匹配文件名称,大写和小写不敏感.
-t <seconds> 事件发生时的秒数.
-e <event> 监听那些事件的发生
--timefmt option 指定输出的时间格式
--format <fmt> 输出指定时间格式.
%w 监控事件发生时的文件名称或文件路径
%f 监控文件夹内部事件发生时文件名称称
%e 监控指定的事件发生
%T 输出事件发生时的时间,--timefmt option指定格式
inotifywatch:
使用linux的inotify特性监控某段时间内的文件状态,并输出摘要报表.
例子:输出beagle文件夹下60秒内的訪问和改动事件触发报表
- % 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
- #!/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系统下的目录变化监控的更多相关文章
- Linux系统下/tmp目录文件重启后自动删除,不重启自动删除10天前的/TMP的文件(转)
/tmp目录文件重启后自动删除现在知道有ubuntu和solaris系统source:http://blog.chinaunix.net/uid-26212859-id-3567875.html经常会 ...
- Linux系统下查看目录大小
转载:http://blog.csdn.net/iamlaosong/article/details/7085178 我们有个系统每天要下载数据,为了检查下载数据是否正常,需要查看下载数据目录大小,因 ...
- Linux系统下进入目录文件需要什么权限?
在Linux下进入目录需要什么权限? 1--让我们先来了解一下Linux下一个文件有哪些权限?(在linux下一切皆文件) 一个文件可以具有的权限有:可读.可写.可执行权限 r 可读权限---read ...
- linux系统下Nagios+rrdtool+Pnp4nagios监控环境的搭建
环境中的软件版本>>>>>>>>>>>>>>>>>>nagios版本:3.5.1rrdtoo ...
- Linux系统下统计目录及其子目录文件个数
(1)查看某目录下文件的个数: ls -l |grep "^-"|wc -l 或 find ./company -type f | wc -l (2)查看某目录下文件的个数,包括子 ...
- Linux系统下Apache2.4.17的安装过程
Linux系统下安装Apache Server2.4.17.还是先声明一下,Linux命令我不进行讲解,因为我不是讲Linux命令的.有需要注意的地方,我会上图,没什么值得的注意的地方,我就不上图了. ...
- linux系统下修改文件夹目录权限
linux系统下修改文件夹目录权限 文件夹权限问题 Linux.Fedora.Ubuntu修改文件.文件夹权限的方法差不多.很多人开始接触Linux时都很头痛Linux的文件权限问题.这里告诉大家如何 ...
- linux系统下nginx安装目录和nginx.conf配置文件目录
linux系统下nginx安装目录和nginx.conf配置文件目录 1.查看nginx安装目录 输入命令 # ps -ef | grep nginx 返回结果包含安装目录 root 26 ...
- linux系统下的权限知识梳理
下面对linux系统下的有关权限操作命令进行了梳理总结,并配合简单实例进行说明.linux中除了常见的读(r).写(w).执行(x)权限以外,还有其他的一些特殊或隐藏权限,熟练掌握这些权限知识的使用, ...
随机推荐
- Android控件常见属性
1.宽/高android:layout_width android:layout_height// 取值match_parent //匹配父控件wrap_content //自适应,根据内容 如果指定 ...
- javascript 数组 find
find() 方法返回通过测试(函数内判断)的数组的第一个元素的值. let arr = [1,2,3,4] console.log(arr.find(i => {return i>1}) ...
- 用Python实现邮件发送Hive明细数据
代码地址如下:http://www.demodashi.com/demo/12673.html 一.需求描述 客户需要每周周一接收特定的活动数据,生成Excel或是CSV文件,并通过邮件发送给指定接收 ...
- cmd命令速查手册
CMD命令速查手册ASSOC显示或修改文件扩展名关联AT 计划在计算机上运行的命令和程序ATTRIB 显示或更改文件属性BREAK 设置或清除扩展式 CTRL+C检查CACLS显示或修改文件的访问控制 ...
- matlab 常用函数汇总
1. 特殊变量与常数 主题词 意义 主题词 意义 ans 计算结果的变量名 computer 确定运行的计算机 eps 浮点相对精度 Inf 无穷大 I 虚数单位 inputname 输入参数名 Na ...
- different between method and function
A method is on an object. A function is independent of an object. For Java, there are only methods. ...
- java游戏开发之基础
© 版权声明:本文为博主原创文章,转载请注明出处 游戏图形界面开发基础 AWT:(Abstract Window Toolkit,抽象窗口工具集) AWT中包含图形界面编程的基本类库,是Java语言G ...
- hdu 4112 Break the Chocolate(乱搞题)
题意:要把一块n*m*k的巧克力分成1*1*1的单元,有两种操作方式:1,用手掰(假设力量无穷大),每次拿起一块,掰成两块小的:2,用刀切(假设刀无限长),可以把多块摆在一起,同时切开.问两种方式各需 ...
- Unity2D实现人物三连击
之前写过一个系列<HTML5 2D平台游戏开发>,在此过程中发现有很多知识点没有掌握,而且用纯JavaScript来开发一个游戏效率极低,因为调试与地图编辑都没有可视化的工具,开发起来费时 ...
- 千万级的大表!MySQL这样优化更好
对于一个千万级的大表,现在可能更多的是亿级数据量,很多人第一反应是各种切分,可结果总是事半功倍,或许正是我们优化顺序的不正确.下面我们来谈谈怎样的优化顺序可以让效果更好. MySQL数据库一般都是按照 ...