系统监控工具----Inotify-Tools

简介:

      Inotify,它是在内核 2.6.13 版本中引入的一个新功能,它为用户态监视文件系统的变化提供了强大的支持,允许监控程序打开一个独立文件描述符,并针对事件集监控一个或者多个文件,例如打开、关闭、移动/重命名、删除、创建或者改变属性。

       在inotify 的前身是 dnotify。由于 dnotify 的局限性太大,加之用户始终都希望用到更好的产品。因此,inotify 顺理成章的取代了 dnotify。


inotify 取代 dnotify 的原因有哪些呢?

1、Inotify 使用一个独立的文件描述符,而 dnotify 需要为每个受监控的目录打开一个文件描述符。当你同时监控多个目录时,就会消耗大量的资源,因此成本会非常高,而且还会遇到每个进程文件描述符数量的限制。

2、Inotify 所使用的文件描述符可以通过系统调用获得,并且没有相关设备或者文件。而 dnotify 在使用时,文件描述符会锁定目录,导致设备无法卸载,这是可移动媒体的一个典型问题。在使用 inotify 时,如果正在监控被卸载的文件系统上的文件,那么 watch 会被自动移除,并且您会接收到一个 umount 事件。

3、dnotify 的设计过于复杂。inotify 能够监视文件或者目录,而使用 dnotify时,监控粒度只停留于目录级别。为了使 dnotify 能够进行更细粒度的监控,应用程序编程人员必须为每个受监控的目录保留一个 stat 结构的缓存。该用户空间的 stat 结构缓存需要用来明确确定当接收到通知信号时,目录发生了什么变化。当获得通知信号时,生成 stat 结构列表并与最新的状态相比较。很明显,这种技术是不太理想的。

4、inotify 使用文件描述符作为基本接口,允许应用程序开发者使用 select 和 poll来监控设备,并且允许高效的多路 I/O 和与 Glib 的mainloop 的集成。相反,dnotify 所使用的 SIGIO 常常使程序员头疼并且感觉不太优雅。在 2.6.25 内核中 inotify 还添加了 Signal-drive I.O 通知功能。

       由于 inotify 是内核中的功能,因此为了让用户态更方便的去使用到它,它通过提供一个更优雅的 API 来解决了这些问题。该 API 使用最少的文件描述符,并确保更细粒度的监控,与 inotify 的通信是通过设备节点提供的。

   

下面,列举 inotify 中可用的函数:

1
2
3
4
5
6
inotify_init     # 用于创建一个 inotify 实例的系统调用,并返回一个指向该实例的文件描述符
inotify_init1与  # inotify_init 相似,并带有附加标志。如果这些附加标志没有指定,将采用与 inotify_init 相同的值
inotify_add_watch  # 增加对文件或者目录的监控,并指定需要监控哪些事件。标志用于控制是否将事件添加到已有的监控中,是否只有路径代表一个目录才进行监控,是否要追踪符号链接,是否进行一次性监控,当首次事件出现后就停止监控
inotify_rm_watch  # 从监控列表中移出监控项目
read  # 读取包含一个或者多个事件信息的缓存
close  # 关闭文件描述符,并且移除所有在该描述符上的所有监控。当关于某实例的所有文件描述符都关闭时,资源和下层对象都将释放,以供内核再次使用


因此,一个典型的监控程序需要进行如下操作:

1
2
3
4
5
1 使用 inotify_init 打开一个文件描述符
2 添加一个或者多个监控
3 等待事件
4 处理事件,然后返回并等待更多事件
5 当监控不再活动时,或者接到某个信号之后,关闭文件描述符,清空,然后退出。


 

可监控的事件

作为文件系统事件监控机制,到底有哪些事件能够被监控呢?

下面为大家列举,inotify所能监控的事件标志如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
IN_ACCESS   被监控项目或者被监控目录中的条目被访问过。例如,一个打开的文件被读取。
IN_MODIFY   被监控项目或者被监控目录中的条目被修改过。例如,一个打开的文件被修改。
IN_ATTRIB     被监控项目或者被监控目录中条目的元数据被修改过。例如,时间戳或者许可被修改。
IN_CLOSE_WRITE        一个打开的,等待写入的文件或目录被关闭。
IN_CLOSE_NOWRITE  一个以只读方式打开的文件或目录被关闭。
IN_CLOSE    一个掩码,可以很便捷地对前面提到的两个关闭事件(IN_CLOSE_WRITE | IN_CLOSE_NOWRITE)进行逻辑操作。
IN_OPEN    文件或目录被打开。
IN_MOVED_FROM     被监控项目或者被监控目录中的条目被移出监控区域。该事件还包含一个 cookie 来实现 IN_MOVED_FROM 与 IN_MOVED_TO 的关联。
IN_MOVED_TO          文件或目录被移入监控区域。该事件包含一个针对 IN_MOVED_FROM 的 cookie。如果文件或目录只是被重命名,将能看到这两个事件,如果它只是被移入或移出非监控区域,将只能看到一个事件。如果移动或重命名一个被监控项目,监控将继续进行。参见下面的 IN_MOVE-SELF。
IN_MOVE    可以很便捷地对前面提到的两个移动事件(IN_MOVED_FROM | IN_MOVED_TO)进行逻辑操作的掩码。
IN_CREATE 在被监控目录中创建了子目录或文件。
IN_DELETE  被监控目录中有子目录或文件被删除。
IN_DELETE_SELF  被监控项目本身被删除。监控终止,并且将收到一个 IN_IGNORED 事件。
IN_MOVE_SELF    监控项目本身被移动。


      除了事件标志以外,还可以在 inotify 头文件(/usr/include/sys/inotify.h)中找到其他几个标志。

      例如,如果只想监控第一个事件,可以在增加监控时,设置 IN_ONESHOT 标志。

 



 inotify-tools详解

      上面,简单介绍了 inotify 原理相关的东西。其中,我提到了 inotify 提供了面向用户态的 API 。那么 inotify 在用户态的表现形式是什么呢?

      这就需要用到一个工具inotify-tools 。

      inotify-tools 是为linux下inotify文件监控工具提供的一套c的开发接口库函数,同时还提供了一系列的命令行工具,这些工具可以用来监控文件系统的事件。 inotify-tools是用c编写的,除了要求内核支持 inotify 外,不依赖于其他。

 

下面来看如何安装inotify-tools!


1
2
3
4
环境
CentOS6.5 x86_64位 采用最小化安装,系统经过了基本优化
selinux为关闭状态,iptables为无限制模式
源码包存放位置: /root



1、查看服务器内核是否支持inotify

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

1
2
3
4
5
6
[root@ rsync -client ~] # uname -r
2.6.32-431.el6.x86_64
[root@ rsync -client ~] # ll /proc/sys/fs/inotify/*
-rw-r--r-- 1 root root 0 Jun  4 15:30  /proc/sys/fs/inotify/max_queued_events
-rw-r--r-- 1 root root 0 Jun  4 15:30  /proc/sys/fs/inotify/max_user_instances
-rw-r--r-- 1 root root 0 Jun  4 15:30  /proc/sys/fs/inotify/max_user_watches


 inotify 的默认内核参数详解

1
2
3
4
5
6
7
8
9
10
11
12
/proc/sys/fs/inotify/max_queued_events
     默认值: 16384
     该文件中的值为调用inotify_init时分配给inotify instance中可排队的event的数目的最大值,超出这个值得事件被丢弃,但会触发IN_Q_OVERFLOW事件
/proc/sys/fs/inotify/max_user_instances
     默认值: 128
     指定了每一个real user ID可创建的inotify instatnces的数量上限
/proc/sys/fs/inotify/max_user_watches
     默认值: 8192
     指定了每个inotify instance相关联的watches的上限,也就是每一个inotify实例可监控的最大目录数。如果监控的文件数目巨大,需要根据实际情况适当增加此值得大小。
 
注意: 
     max_queued_events 是 Inotify 管理的队列的最大长度,文件系统变化越频繁,这个值就应该越大!如果你在日志中看到Event Queue Overflow,说明max_queued_events太小需要调整参数后再次使用


调整范例:

1
2
[root@ rsync -client ~]
echo  10000000 >  /proc/sys/fs/inotify/max_user_watches


2、安装inotify-tools

1
2
3
4
5
6
[root@ rsync -client ~] # yum install make  gcc gcc-c++
[root@ rsync -client ~] # wget http://nchc.dl.sourceforge.net/project/inotify-tools/inotify-tools/3.13/inotify-tools-3.13.tar.gz
[root@ rsync -client ~] # tar xzf inotify-tools-3.13.tar.gz
[root@ rsync -client ~] # cd inotify-tools-3.13
[root@ rsync -client inotify-tools-3.13] # ./configure
[root@ rsync -client inotify-tools-3.13] # make && make install


OK!这样就安装完成了!


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

1
2
3
[root@ rsync -client ~] # ll /usr/local/bin/inotify*
-rwxr-xr-x. 1 root root 38582 Jun  3 22:23  /usr/local/bin/inotifywait
-rwxr-xr-x. 1 root root 40353 Jun  3 22:23  /usr/local/bin/inotifywatch


其中

1
2
       inotifywait 仅执行阻塞,等待 inotify 事件,你可以使用它来监控任何一组文件和目录,或监控整个目录树(目录、子目录、子目录的子目录等等),并且可以结合 shell 脚本,更好的使用 inotifywait。
       inotifywatch 用来收集关于被监视的文件系统的统计数据,包括每个 inotify 事件发生多少次。



 inotifywait和inotifywatch学习

下面,我来带大家一起来学习下这2个命令的用法!

inotifywait

语法:
       

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

选项参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
-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

文件系统取消挂载,之后不再监听此文件系统。

 

这里呢,我准备了一些范例来帮助大家理解 inotifywait 命令的使用。

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

1
2
3
4
5
6
7
8
9
[root@ rsync -client ~] # inotifywait -rm /etc
Setting up watches.  Beware: since -r was given, this may take a  while !
Watches established.
/etc/  OPEN ld.so.cache
/etc/  CLOSE_NOWRITE,CLOSE ld.so.cache
/etc/  CREATE  test
/etc/  OPEN  test
/etc/  ATTRIB  test
/etc/  CLOSE_WRITE,CLOSE  test


此时,我在另外一个新打开的终端,touch /etc/test,这边就会产生相应的事件信息了。


2、实时监控/home目录的文件或目录创建,修改和删除相关事件

1
2
3
4
5
6
7
8
[root@ rsync -client ~] # inotifywait -mrq -e create,modify,delete /home
/home/  CREATE,ISDIR test2
/home/test2/  CREATE .bash_profile
/home/test2/  MODIFY .bash_profile
/home/test2/  CREATE .bash_logout
/home/test2/  MODIFY .bash_logout
/home/test2/  CREATE .bashrc
/home/test2/  MODIFY .bashrc


此时,我在新打开的终端上,使用useradd创建一个用户,这边就会产生相应的事件信息了!


3、实时监控/etc/passwd的文件修改,删除和权限相关事件,并且要求指定输出格式为27/06/14 16:12 /etc/passwd ATTRIB。

1
2
3
[root@ rsync -client ~] # inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format  '%T %w%f %e' --event modify,delete,attrib  /etc/passwd
27 /06/14  16:39  /etc/passwd  ATTRIB
27 /06/14  16:39  /etc/passwd  IGNORED


此时,我在新打开的终端上,使用 useradd 创建一个新用户,这边就会产生相应的事件信息了!

 

4、写一个脚本实现对 /data/web 目录进行监控,监控文件删除,修改,创建和权限相关事件,并且要求将监控信息写入/var/log/web_watch.log。要求日志条目要清晰明了,能突显文件路径、事件名和时间。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@ rsync -client ~] # cat web_watch.sh
#!/bin/bash
inotifywait -mrq --timefmt  '%y/%m/%d %H:%M'  -- format   '%T %w%f %e'  --event delete,modify,create,attrib   /data/web  while  read   date  time  file  event
   do
       case  $event  in
           MODIFY|CREATE|MOVE|MODIFY,ISDIR|CREATE,ISDIR|MODIFY,ISDIR)
                   echo  $event '-' $ file '-' $ date '-' $ time  >>  /var/log/web_watch .log
               ;;
   
           MOVED_FROM|MOVED_FROM,ISDIR|DELETE|DELETE,ISDIR)
                   echo  $event '-' $ file '-' $ date '-' $ time  /var/log/web_watch .log
               ;;
       esac
   done
[root@ rsync -client ~] # cat /var/log/web_watch.log 
CREATE- /data/web/a-14/06/27-16 :21
CREATE- /data/web/aa-14/06/27-16 :21
CREATE- /data/web/aaaa-14/06/27-16 :24
CREATE- /data/web/aaaaa-14/06/27-16 :24

此时,我在新打开的终端上,使用 touch 在/data/web目录下创建a,aa,aaa,aaaa这四个文件。然后查看/var/log/web_watch.log 文件,即可发现已经产生相应的事件信息,并且按照指定格式进行存放!

 

inotifywatch

语法:

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


参数:

1
2
3
4
5
6
7
8
9
10
11
12
-h,–help     # 输出帮助信息
- v ,–verbose  # 输出详细信息
@              # 排除不需要监视的文件,可以是相对路径,也可以是绝对路径。
–fromfile     # 从文件读取需要监视的文件或排除的文件,一个文件一行,排除的文件以@开头。
-z,–zero     # 输出表格的行和列,即使元素为空
–exclude      # 正则匹配需要排除的文件,大小写敏感。
–excludei     # 正则匹配需要排除的文件,忽略大小写。
-r,–recursive   # 监视一个目录下的所有子目录。
-t,–timeout     # 设置超时时间
-e,–event       # 只监听指定的事件。
-a,–ascending   # 以指定事件升序排列。
-d,–descending  # 以指定事件降序排列


 OK,继续拿一个范例来帮助大家理解!

1、统计/home目录所在文件系统发生的事件次数

1
2
3
4
5
6
7
8
9
[root@ rsync -client ~] # 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 3 watches.
Finished establishing watches, now collecting statistics.
Will listen  for  events  for  60 seconds.
total  modify  create  delete  filename
8           3            4          1        /home/


监控的时候,我在新打开的终端上,创建了4个文件,修改了3个文件内容,删除了一个文件。等监控的30秒时间到了之后,他就会显示出上面的事件次数报告!


OK,以上就是 inotify 和 inotify -tools 的相关介绍和使用方法,希望对51博友有所帮助!










本文转自 aaao 51CTO博客,原文链接:http://blog.51cto.com/nolinux/1431742,如需转载请自行联系原作者

目录
相关文章
|
10月前
|
存储 监控 Unix
Linux--zabbix网络监控系统
Linux--zabbix网络监控系统
148 0
|
监控 Oracle IDE
关于Solaris中类似于的Inotify功能
当年的巨无霸一去不复返了啊。在SUN收购Mysql之后,我们还在讨论SUN已经是一个全产业链的超级大公司了。那时的SUN有语言JAVA,有操作系统Solaris,有数据库Mysql,有IDE,有硬件。
54 0
|
监控 机器人 Java
lite-monitor 一款基于 shell 命令的监控系统
lite-monitor 一款基于 shell 命令的监控系统
97 0
|
监控 Linux Shell
阿里云监控 Linux Agent安装
阿里云监控 Linux Agent安装 安装 直接复制以下命令后在服务器上使用 root 权限运行即可。 64位 sudo bash -c "wget -e 'http_proxy=hzcmsproxy.
1681 0
|
监控 Shell API
使用inotify-tools与rsync构建实时备份系统
使用inotifywait监控文件变动 inotifywait是 inotify-tools 包中提供的一个工具,它使用 inotify API 来监控文件/目录中的变动情况。
814 0
|
监控 Linux API
linux实时文件事件监听--inotify
一、inotify简介 inotify是Linux内核2.6.13 (June 18, 2005)版本新增的一个子系统(API),它提供了一种监控文件系统(基于inode的)事件的机制,可以监控文件系统的变化如文件修改、新增、删除等,并可以将相应的事件通知给应用程序。
3087 0