两个月没写了。。拿个最近写的出来看下。
在使用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/
转载于:https://blog.51cto.com/qujunorz/1753395
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/109116.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...