近期,有个项目须要及时删除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: 
  捕获文件系统的各种状态事件

  1. inotify events
  2. Bit                Description
  3. IN_ACCESS          File was accessed (read) (*)
  4. IN_ATTRIB          Metadata changed (permissions, timestamps,
  5. extended attributes, etc.) (*)
  6. IN_CLOSE_WRITE     File opened for writing was closed (*)
  7. IN_CLOSE_NOWRITE   File not opened for writing was closed (*)
  8. IN_CREATE          File/directory created in watched directory (*)
  9. IN_DELETE          File/directory deleted from watched directory (*)
  10. IN_DELETE_SELF     Watched file/directory was itself deleted
  11. IN_MODIFY          File was modified (*)
  12. IN_MOVE_SELF       Watched file/directory was itself moved
  13. IN_MOVED_FROM      File moved out of watched directory (*)
  14. IN_MOVED_TO        File moved into watched directory (*)
  15. 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秒内的訪问和改动事件触发报表

  1. % inotifywatch -v -e access -e modify -t 60 -r ~/.beagle
  2. Establishing watches...
  3. Setting up watch(es) on /home/rohan/.beagle
  4. OK, /home/rohan/.beagle is now being watched.
  5. Total of 302 watches.
  6. Finished establishing watches, now collecting statistics.
  7. Will listen for events for 60 seconds.
  8. total  access  modify  filename
  9. 1436   1074    362     /home/rohan/.beagle/Indexes/FileSystemIndex/PrimaryIndex/
  10. 1323   1053    270     /home/rohan/.beagle/Indexes/FileSystemIndex/SecondaryIndex/
  11. 303    116     187     /home/rohan/.beagle/Indexes/KMailIndex/PrimaryIndex/
  12. 261    74      187     /home/rohan/.beagle/TextCache/
  13. 206    0       206     /home/rohan/.beagle/Log/
  14. 42     0       42      /home/rohan/.beagle/Indexes/FileSystemIndex/Locks/
  15. 18     6       12      /home/rohan/.beagle/Indexes/FileSystemIndex/
  16. 12     0       12      /home/rohan/.beagle/Indexes/KMailIndex/Locks/
  17. 3      0       3       /home/rohan/.beagle/TextCache/54/
  18. 3      0       3       /home/rohan/.beagle/TextCache/bc/
  19. 3      0       3       /home/rohan/.beagle/TextCache/20/
  20. 3      0       3       /home/rohan/.beagle/TextCache/62/
  21. 2      2       0       /home/rohan/.beagle/Indexes/KMailIndex/SecondaryIndex/

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

    1. #!/bin/sh
    2. # A slightly complex but actually useful example
    3. logfile="/opt/data/cache_list.txt"
    4. temp_logfile="/opt/data/cache_tempfile.txt"
    5. /usr/local/bin/inotifywait -mrq  --format '%w%f' -e moved_to /opt/data/proxy_cache_dir/| while read  file;
    6. do
    7. 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
    8. done

使用inotify实现linux系统下的目录变化监控的更多相关文章

  1. Linux系统下/tmp目录文件重启后自动删除,不重启自动删除10天前的/TMP的文件(转)

    /tmp目录文件重启后自动删除现在知道有ubuntu和solaris系统source:http://blog.chinaunix.net/uid-26212859-id-3567875.html经常会 ...

  2. Linux系统下查看目录大小

    转载:http://blog.csdn.net/iamlaosong/article/details/7085178 我们有个系统每天要下载数据,为了检查下载数据是否正常,需要查看下载数据目录大小,因 ...

  3. Linux系统下进入目录文件需要什么权限?

    在Linux下进入目录需要什么权限? 1--让我们先来了解一下Linux下一个文件有哪些权限?(在linux下一切皆文件) 一个文件可以具有的权限有:可读.可写.可执行权限 r 可读权限---read ...

  4. linux系统下Nagios+rrdtool+Pnp4nagios监控环境的搭建

    环境中的软件版本>>>>>>>>>>>>>>>>>>nagios版本:3.5.1rrdtoo ...

  5. Linux系统下统计目录及其子目录文件个数

    (1)查看某目录下文件的个数: ls -l |grep "^-"|wc -l 或 find ./company -type f | wc -l (2)查看某目录下文件的个数,包括子 ...

  6. Linux系统下Apache2.4.17的安装过程

    Linux系统下安装Apache Server2.4.17.还是先声明一下,Linux命令我不进行讲解,因为我不是讲Linux命令的.有需要注意的地方,我会上图,没什么值得的注意的地方,我就不上图了. ...

  7. linux系统下修改文件夹目录权限

    linux系统下修改文件夹目录权限 文件夹权限问题 Linux.Fedora.Ubuntu修改文件.文件夹权限的方法差不多.很多人开始接触Linux时都很头痛Linux的文件权限问题.这里告诉大家如何 ...

  8. linux系统下nginx安装目录和nginx.conf配置文件目录

    linux系统下nginx安装目录和nginx.conf配置文件目录 1.查看nginx安装目录 输入命令 # ps  -ef | grep nginx 返回结果包含安装目录 root      26 ...

  9. linux系统下的权限知识梳理

    下面对linux系统下的有关权限操作命令进行了梳理总结,并配合简单实例进行说明.linux中除了常见的读(r).写(w).执行(x)权限以外,还有其他的一些特殊或隐藏权限,熟练掌握这些权限知识的使用, ...

随机推荐

  1. 单点登录cas常见问题(四) - ticket有哪些存储方式?

    配置文件ticketRegistry.xml负责配置ticket的存储方式,registry是注冊表,登记薄的意思 经常使用的存储方式包含 1.DefaultTicketRegistry:默认的.存储 ...

  2. 如何在Django1.6结合Python3.3版本中使用MySql

    用起了Python3.4跟Django1.6,数据库依然是互联网企业常见的MySql. 悲催的是在Python2.7时代连接MySql的MySQLdb还不支持Python3.4,还好,苦苦追问G哥终于 ...

  3. 微信小程序 之 请求函数封装

    封装的request的代码 /** * @desc API请求接口类封装 */ /** * POST请求API * @param {String} url 接口地址 * @param {Object} ...

  4. 把数据库里面的stu表中的数据,导出到excel中

    # 2.写代码实现,把我的数据库里面的stu表中的数据,导出到excel中 #编号 名字 性别 # 需求分析:# 1.连接好数据库,写好SQL,查到数据 [[1,'name1','男'],[1,'na ...

  5. sklearn--feature extract--人脸识别

    1.原始数据加载 import matplotlib.pyplot as plt from sklearn.datasets import fetch_lfw_people people=fetch_ ...

  6. java之Cookie具体解释

    Cookie是由server端生成.发送给User-Agent(通常是浏览器).浏览器会将Cookie的key/value保存到某个文件夹下的文本文件内.下次请求同一站点时就发送该Cookie给ser ...

  7. WebStorm初次使用

    1. ctrl + / : 单行注释2. ctrl + shift + / : 块注释 3:展开当前函数代码:Ctrl+“+”,收起当前代码:Ctrl+“-” 4:全局查找: Ctrl+Shift+F ...

  8. 解决H5在微信浏览器或QQ浏览器修改title的问题

    传送门:http://blog.csdn.net/code_for_free/article/details/51195468 如果是Android,使用 document.title = ‘1231 ...

  9. java之JDK动态代理

    © 版权声明:本文为博主原创文章,转载请注明出处 JDK动态代理: JDK动态代理就是在程序运行期间,根据java的反射机制自动的帮我们生成相应的代理类 优势: - 1. 业务类只需要关注业务逻辑本身 ...

  10. ctrip-apollo windows环境部署

    https://blog.csdn.net/u010286334/article/details/78389484转载过来的方法,尝试了没有成功,不晓得哪里错了,无法打包portal访问 1.下载源码 ...