近期,有个项目须要及时删除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. Elasticsearch 2014年10月简报

    1. Elasticsearch Updates 1.1 公布了Kibana 4 Beta 1 和Beta 1.1 Kibana 4不管是在界面的布局,使用配置方法,还是底层绘制图表的方式都与Kiba ...

  2. js 获取浏览器显示内容的宽度和高度

      js获取浏览器显示内容的宽度和高度 CreateTime--2017年7月10日17:24:12Author:Marydon 1.获取浏览器屏幕显示d的网页宽度 /** * 得到浏览器显示的屏幕高 ...

  3. Oracle 为表空间增加数据文件

    dba权限检查下 select tablespace_name, file_id, file_name, ),) total_space from dba_data_files order by ta ...

  4. 正则表达式匹配 href 和text内容

    string pattern = @"<a[^>]*href=(""(?<href>[^""]*)""|' ...

  5. C#中后台线程和UI线程的交互

    在C#中,从Main()方法开始一个默认的线程,一般称之为主线程,如果在这个进行一些非常耗CPU的计算,那么UI界面就会被挂起而处于假死状态,也就是说无法和用户进行交互了,特别是要用类似进度条来实时显 ...

  6. javascript 温故而知新 getBoundingClientRect

    getBoundingClientRect获取元素位置  getBoundingClientRect用于获得页面中某个元素的左,上,右和下分别相对浏览器视窗的位置. getBoundingClient ...

  7. 网络数据传输socket和http优缺点

    数据传输方式 Socket传输的定义 所谓socket通常也称作"套接字",实现服务器和客户端之间的物理连接,并进行数据传输,主要有UDP和TCP两个协议.Socket处于网络协议 ...

  8. How to Use HTML5 FUll Screen API(怎样使用HTML5全屏接口)

    原文链接:http://www.sitepoint.com/use-html5-full-screen-api/ 假设你不太喜欢变化太快的东西,那么web开发可能不适合你. 我曾在2012年末有写过F ...

  9. Ocelot --API网关简单使用

    最近几个月一直在忙一个项目(感觉像是与世隔绝了),本来想好的是要写一些asp.net core 的一些简单使用上东西,也就放下了. 好在忙完了,也就重新开始写吧.写点什么呢?网上也有不少dotnet ...

  10. PHP压缩上传图片

    最近手上的项目页面要显示很多图片,虽然用了jQuery的lazyload,但是效果并没理想,滑动到一个区域还要比较长的时间图片才完全显示出来.于是想着将上传上去的900KB+压缩备份一份缩略图. PH ...