实践记录之-系统监控工具Inotify-tool

        Inotify 是一个 Linux特性,它监控文件系统操作,比如读取、写入和创建。Inotify 反应灵敏,用法非常简单,并且比 cron 任务的繁忙轮询高效得多。学习如何将 inotify 集成到您的应用程序中,并发现一组可用来进一步自动化系统治理的命令行工具。

        要使用 inotify,必须具备一台带有 2.6.13 或更新内核的 Linux 机器(以前的 Linux 内核版本使用更低级的文件监控器dnotify)。

        

1、检察服务器内核是否支持inotify

安装inotify 的第一步是确定你使用的 Linux 内核是否支持它

[root@localhost ~]# uname -r
2.6.32-358.el6.x86_64
[root@localhost ~]# ll /proc/sys/fs/inotify/
total 0
-rw-r--r-- 1 root root 0 Jul  9 15:01 max_queued_events
-rw-r--r-- 1 root root 0 Jul  9 15:01 max_user_instances
-rw-r--r-- 1 root root 0 Jul  9 15:01 max_user_watches

inotify 的默认内核参数详解

a./proc/sys/fs/inotify/max_queued_events

    默认值: 16384

    该文件中的值为调用inotify_init时分配给inotify instance中可排队的event的数目的最大值,超出这个值得事件被丢弃,但会触发IN_Q_OVERFLOW事件

b./proc/sys/fs/inotify/max_user_instances

    默认值: 128

    指定了每一个real user ID可创建的inotify instatnces的数量上限

c./proc/sys/fs/inotify/max_user_watches

    默认值: 8192

    指定了每个inotify instance相关联的watches的上限,也就是每一个inotify实例可监控的最大目录数。如果监控的文件数目巨大,需要根据实际情况适当增加此值得大小。

注意: 

    max_queued_events 是 Inotify 管理的队列的最大长度,文件系统变化越频繁,这个值就应该越大!如果你在日志中看到Event Queue Overflow,说明max_queued_events太小需要调整参数后再次使用

2、安装inotify-tools

[root@localhost ~]# yum install make  gcc gcc-c++
[root@localhost ~]# wget http://nchc.dl.sourceforge.net/project/inotify-tools/inotify-tools/3.13/inotify-tools-3.13.tar.gz
[root@localhost ~]# tar xzf inotify-tools-3.13.tar.gz
[root@localhost ~]# cd inotify-tools-3.13
[root@localhost inotify-tools-3.13]# ./configure
[root@localhost inotify-tools-3.13]# make && make install

安装过程很简单,这样就安装完成了!

在编译安装 inotify-tools 成功之后,默认情况会在 /usr/local/bin 目录下生成两个二进制文件:

[root@localhost inotify-tools-3.13]# ll /usr/local/bin/
total 80
-rwxr-xr-x 1 root root 38582 Jul  9 15:25 inotifywait
-rwxr-xr-x 1 root root 40353 Jul  9 15:25 inotifywatch

其中

inotifywait 仅执行阻塞,等待 inotify 事件,你可以使用它来监控任何一组文件和目录,或监控整个目录树(目录、子目录、子目录的子目录等等),并且可以结合 shell 脚本,更好的使用 inotifywait。

inotifywatch 用来收集关于被监视的文件系统的统计数据,包括每个 inotify 事件发生多少次。


3.inotifywait和inotifywatch用法介绍:

inotifywait

语法: 

inotifywait [-hcmrq] [-e ] [-t ] [--format ] [--timefmt ] [ ... ]

-h,-help    # 输出帮助信息
@     # 排除不需要监视的文件,可以是相对路径,也可以是绝对路径
--fromfile   # 从文件读取需要监视的文件或排除的文件,一个文件一行,排除的文件以@开头
-m,-monitor # 接收到一个事情而不退出,无限期地执行。默认行为是接收到一个事情后立即退出
-d,-daemon  # 跟-monitor一样,除了是在后台运行,需要指定 -outfile把事情输出到一个文件。也意味着使用了-syslog
-o,-outfile # 输出事情到一个文件而不是标准输出。
-s,-syslog  # 输出错误信息到系统日志
-r,-recursive # 监视一个目录下的所有子目录。
-q,-quiet   # 指定一次,不会输出详细信息,指定二次,除了致命错误,不会输出任何信息。
-exclude    # 正则匹配需要排除的文件,大小写敏感。
-excludei   # 正则匹配需要排除的文件,忽略大小写。
-t,-timeout# 设置超时时间,如果为0,则无限期地执行下去。
-e,-event   # 指定监视的事件。
-c,-csv     # 输出csv格式。
--timefmt    # 指定时间格式,用于-format选项中的%T格式。
--format     # 指定输出格式。
   %w 表示发生事件的目录
   %f 表示发生事件的文件
   %e 表示发生的事件
   %Xe 事件以“X”分隔
   %T 使用由-timefmt定义的时间格式

下面是一些可监听事件,针对-e选项使用:

access    文件读取    
modify    文件更改。    
attrib    文件属性更改,如权限,时间戳等。    
close_write    以可写模式打开的文件被关闭,不代表此文件一定已经写入数据。    
close_nowrite    以只读模式打开的文件被关闭。    
close    文件被关闭,不管它是如何打开的。    
open    文件打开。    
moved_to    一个文件或目录移动到监听的目录,即使是在同一目录内移动,此事件也触发。    
moved_from    一个文件或目录移出监听的目录,即使是在同一目录内移动,此事件也触发。    
move    包括moved_to和 moved_from    
move_self    文件或目录被移除,之后不再监听此文件或目录。    
create    文件或目录创建    
delete    文件或目录删除    
delete_self    文件或目录移除,之后不再监听此文件或目录    
unmount    文件系统取消挂载,之后不再监听此文件系统。

 实例 :

1.实时监控/etc目录的所有事件(包括文件的访问,写入,修改,删除等)  

[root@localhost inotify-tools-3.13]# /usr/local/bin/inotifywait -mr /etc/ 


2.实时监控/home目录的文件或目录创建,修改和删除相关事件并按指定格式输出

[root@localhost inotify-tools-3.13]# /usr/local/bin/inotifywait  -mrq -e create,modify,delete --timefmt '%Y%m%d %H:%M:%S' --format  '%T %e %w%f' /home/

wKioL1O9AiPRqwQbAAAQrSyFDAY296.gif

在/home目录下创建te文件和删除,就会输出如上图

3.写个脚本,实时监控httpd目录/var/www/html里文件的删除,修改,创建和权限相关事件,并且要求将监控信息写入/var/log/web_jiankong.log。

/usr/local/bin/inotifywait -mrq --timefmt '%Y/%m/%d %H:%M:%S' --format  '%T %e %w%f ' --event delete,modify,create,attrib  /var/www/html | while read  date event time file 
  do
      case $event in
          MODIFY|CREATE|MOVE|MODIFY)
                  echo $date'-'$time'-'$event'-'$file >> /var/log/web_watch.log
              ;;
      esac
  done



inotifywatch

语法:


inotifywatch [-hvzrqf] [-e ] [-t ] [-a ] [-d ] [ ... ]

    

参数:


   

-h,–help    # 输出帮助信息

-v,–verbose # 输出详细信息

@             # 排除不需要监视的文件,可以是相对路径,也可以是绝对路径。

–fromfile    # 从文件读取需要监视的文件或排除的文件,一个文件一行,排除的文件以@开头。

-z,–zero    # 输出表格的行和列,即使元素为空

–exclude     # 正则匹配需要排除的文件,大小写敏感。

–excludei    # 正则匹配需要排除的文件,忽略大小写。

-r,–recursive  # 监视一个目录下的所有子目录。

-t,–timeout    # 设置超时时间

-e,–event      # 只监听指定的事件。

-a,–ascending  # 以指定事件升序排列。

-d,–descending # 以指定事件降序排列

    

例:统计home目录文件系统30秒内发生的事件次数

/usr/local/bin/inotifywatch -v -e create -e modify -e delete -t 30 -r /home


[root@localhost inotify-tools-3.13]# /usr/local/bin/inotifywatch -v -e create -e modify -e delete -t 30 -r /home
Establishing watches...
Setting up watch(es) on /home
OK, /home is now being watched.
Total of 2 watches.
Finished establishing watches, now collecting statistics.
Will listen for events for 30 seconds.
total  create  delete  filename
4      0       3       /home/cxb/
3      1       2       /home/



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章