两个月没写了。。拿个最近写的出来看下。

    在使用linux过程中,我们会遇到监控某个目录或者文件的变化的需求,如关键配置文件,保密日志等。通常我们会使用定时或者后台脚本来解决,使用find或ls -al等。但这样并不实时而且也不高效。

    我们已经知道在linux系统下,硬件层面我们已经有hotplug和udev来动态检测硬件。内核检测到新硬件插入,然后分别通知hotplug和udev。前者用来装入相应的内核模块(如usb-storage),而后者用来在/dev中创建相应的设备节点(如/dev/sda1)。

    文件系统层面,在内核2.6.13之后,便有inotify来对文件系统进行动态监控了。它能监控文件的创建,访问,删除,修改,属性等操作。

    如何判断自己系统是否支持,可以通过以下命令:

 

#grep INOTIFY_USER /boot/config-$(uname -r)
CONFIG_INOTIFY_USER=y
# cat /proc/sys/fs/inotify/*
16384
128
8192

inotify的原理:

无论是目录还是文件,在内核中都对应一个 inode 结构,inotify 系统在 inode 结构中增加了两个字段:

#ifdef CONFIG_INOTIFY
    struct list_head    inotify_watches; /* watches on this inode */
    struct semaphore    inotify_sem;    /* protects the watches list */
#endif

通常可以通过写c来调用inotify相关函数,当然也可以直接安装好别人写好了的inotify-tool工具来直接调用inotifywatch和inotifywait命令来实现自己的功能,下面是一个简单的监控示例:

#!/bin/bash
#date=20160307
#version=0.4
#inotifywait de jiandan shiyong 

Usage() {
echo "   Usage:./inotify.sh  stop
         ./inotify.sh  file1 file2  ... "
}

if [ $# == 0 ];then
Usage
exit 1
fi

monitor() {
/usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format  '%T %w%f %e' --event modify,delete,create,attrib  $1 | while read  date time file event
  do
      case $event in
          MODIFY|CREATE|MOVE|MODIFY,ISDIR|CREATE,ISDIR|MODIFY,ISDIR)
                  echo "`date`   $event'-'$file" >>/tmp/inotify_monitor.log
              ;;

          MOVED_FROM|MOVED_FROM,ISDIR|DELETE|DELETE,ISDIR)
                  echo "`date`   $event'-'$file" >>/tmp/inotify_monitor.log
              ;;
         
      esac
  done
}

for i in ${@}
do
if [ $i == stop ];then
echo "The monitor has been stop !"
ps -ef |grep [i]notify |grep -v grep|awk '{print $2}'|xargs kill 2>/dev/null
else
monitor $i &
echo "starting monitor $i !"
fi
done

参考:http://www.ibm.com/developerworks/cn/linux/l-inotifynew/