当前位置: 首页 > 工具软件 > inotify-tools > 使用案例 >

linux下通过inotify-tools监控文件系统,linux下通过inotify-tools监控文件系统

佟涵畅
2023-12-01

在Linux下面,有一个软件可以帮我们监控文件系统的改动,就是inotify。这个软件需要内核的支持,内核版本在2.6.13以上的系统可以用 。如需确定内核是否支持,可执行:

[root@slave bin]#  ls -l /proc/sys/fs/inotify

-rw-r--r-- 1 root root 0 10-13 11:30 max_queued_events

-rw-r--r-- 1 root root 0 10-13 11:30 max_user_instances

-rw-r--r-- 1 root root 0 10-13 11:30 max_user_watches

如果显示以上三个文件则表示内核支持inotify。

幸好有一个工具:inotify-tools,使我们可以无需自己写程序而使用inotify的功能。

inotify-tools是用c编写的,除了要求内核支持inotify外,不依赖于其他。

inotify-tools提供两种工具,一是inotifywait,它是用来监控文件或目录的变化,二是inotifywatch,它是用来统计文件系统访问的次数。

安装方法:

1、 wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz

2、tar xzf inotify-tools-3.14.tar.gz

3、cd inotify-tools-3.14

4、./configure --prefix=/usr/inotify-tools-3.14

5、make

6、make install

参数说明

语法: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

指定时间格式,如(“%”后面的大小写代表不同的格式,如%y表示2位的年)

%Y-%m-%d  日期:2012-10-13

%H:%M:%S  时间:15:45:05

是否显示该参数指定的时间,取决于–format选项中是否指定了“%T”。

–format

指定输出格式。

%w 表示发生事件的目录

%f 表示发生事件的文件

%e 表示发生的事件

%Xe 事件以“X”分隔

%T 显示由–timefmt定义的时间格式

参数说明语法:inotifywatch [-hvzrqf] [-e ] [-t ] [-a ] [-d ] [ ... ]

参数:

-h, –help

输出帮助信息

-v, –verbose

输出详细信息

@

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

–fromfile

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

-z, –zero

输出表格的行和列,即使元素为空

–exclude

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

例:要排除/home/mjb目录下的test1,test2,cc目录,可这样写--exclude="/home/mjb/(test1/|test2/|cc/)"。多个目录或文件一定要用“|”分开,不能在命令行中用两个--exclude,否则最后的--exclude会覆盖其它的。系统只是在文件路径中查找是否有上面参数指定的字符,如果有就排除。因此在test1后面加了“/”。否则/home/mjb/test123也会被排除。

–excludei

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

-r, –recursive

监视一个目录下的所有子目录。

-t , –timeout

设置超时时间

-e , –event

只监听指定的事件。

-a , –ascending

以指定事件升序排列。

-d , –descending

以指定事件降序排列。

可监听事件

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、实时监控/home的所有事件(包括文件的访问,写入,修改,删除等)

inotifywait -rm /home

2、监控/var/log/messeges中有关httpd的日志

#!/bin/sh

while inotifywait -e modify /var/log/messages; do

if tail -n1 /var/log/messages | grep httpd; then

kdialog --msgbox "Apache needs love!"

fi

done

3、统计/home文件系统的事件

inotifywatch -v -e access -e modify -t 60 -r /home

4、监控/home/www目录及其下子目录

inotifywait -m -r -d -o /var/log/change.log –timefmt '%F %T’ –format '%T %w%f %e’  -e close_write -e create /home/www

其中/var/log/change.log是日志路径,/home/www是监控的路径

参见:

 类似资料: