使用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: 
  捕获文件系统的各种状态事件

  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
上一篇:android开发之MediaPlayer+Service MP3播放器


下一篇:hibernate 多对多双向关联