近期,有个项目须要及时删除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. 为php5.6.30安装redis扩展

    1.下载phpredis3.1.2 https://github.com/phpredis/phpredis/releases/tag/3.1.2 2.解压后在phpredis3.1.2目录下执行 / ...

  2. 【Xcode学C-3】if等流程控制、函数的介绍说明标记分组、#include以及LLVM

    一.流程控制:if.while和for循环 (1)if括号中面常常遇到推断是否相等的情况,并且新手常常会把==写成=.所以建议的习惯是把常量放在前面.如a==10.写成10==a,这样就不易犯错. ( ...

  3. js 导入json配置文件

    import AA from './menu.json' console.log(AA) 匹配好路径

  4. 安卓---JNI使用

    交叉编译 系统平台:Windows.Mac OS.Linux CPU平台:ARM.X86.MIPS 概念:在一个平台下打包编译出还有一个平台能够运行的程序#交叉编译原理 源代码->预编译-> ...

  5. 基于SpringMVC+Ext.js的权限管理系统(无权限框架)

    代码地址如下:http://www.demodashi.com/demo/12811.html 0.准备工作 注意!!! 本案例数据库相关请下载例子包,内有数据库脚本.EXCEL数据表和详细的设计文档 ...

  6. 按“开始”-“运行”,或按WIN+R,在[运行]窗口中输入

    command--------CMD命令提示符 ipconfig查看本机IP chkdsk.exe-----Chkdsk磁盘检查   certmgr.msc----证书管理实用程序   calc--- ...

  7. Android下 调用原生相机拍照摄像

    1 http://www.cnblogs.com/franksunny/archive/2011/11/17/2252926.html 2 http://www.cnblogs.com/vir56k/ ...

  8. HTML5中两种方法实现客户端存储数据

    HTML5 提供了两种在客户端存储数据的新方法: localStorage - 没有时间限制的数据存储 sessionStorage - 针对一个 session 的数据存储 之前,这些都是由 coo ...

  9. C#中String.Empty、NULL与""三者的区别

    String.Empty和""是一样的,都是空,习惯用string.empty. Null和他们就有区别了,就是没有值,也没分配地址,此处可以理解成什么都没有.

  10. PHP面试题及答案解析(1)—PHP语法基础

    1. strlen( )与 mb_strlen( )的作用分别是什么? strlen和mb_strlen都是用于获取字符串长度.strlen只针对单字节编码字符,也就是说它计算的是字符串的总字节数.如 ...