【转载】CentsOS系统inotify实时监控服务器文件(夹)定制事件处理程序

时间:2022-02-02 21:20:35

原始博文和参考博文

1、CentsOS系统inotify实时监控服务器文件

2、Linux中让进程在后台运行的方法

3、linux inotify 监控文件系统事件 非常好

方法一

说明:

服务器系统:CentOS

文件目录:/home/web/osyunwei.com

实现目的:

当/home/web/osyunwei.com下面除过cache目录之外,任何文件发生变化时,记录日志并保存。

具体操作:

一、安装Inotify-tools工具

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

ll /proc/sys/fs/inotify #列出文件目录,出现下面的内容,说明服务器内核支持inotify

-rw-r--r-- 1 root root 0 Mar 7 02:17 max_queued_events

-rw-r--r-- 1 root root 0 Mar 7 02:17 max_user_instances

-rw-r--r-- 1 root root 0 Mar 7 02:17 max_user_watches

备注:Linux下支持inotify的内核最小为2.6.13,可以输入命令:uname -a查看内核

CentOS 5.X 内核为2.6.18,默认已经支持inotify

2、安装inotify-tools

yum install make gcc gcc-c++ #安装编译工具

inotify-tools下载地址:http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz

上传inotify-tools-3.14.tar.gz到/usr/local/src目录下

cd /usr/local/src

tar zxvf inotify-tools-3.14.tar.gz #解压

cd inotify-tools-3.14 #进入解压目录

./configure --prefix=/usr/local/inotify #配置

make #编译

make install #安装

3、设置系统环境变量,添加软连接

echo "PATH=/usr/local/inotify/bin:$PATH" >>/etc/profile.d/inotify.sh

source /etc/profile.d/inotify.sh #使设置立即生效

echo "/usr/local/inotify/lib" >/etc/ld.so.conf.d/inotify.conf

ln -s /usr/local/inotify/include /usr/include/inotify

4、修改inotify默认参数(inotify默认内核参数值太小)

查看系统默认参数值

sysctl -a | grep max_queued_events

结果是:fs.inotify.max_queued_events = 16384

sysctl -a | grep max_user_watches

结果是:fs.inotify.max_user_watches = 8192

sysctl -a | grep max_user_instances

结果是:fs.inotify.max_user_instances = 128

修改参数:

sysctl -w fs.inotify.max_queued_events="99999999"

sysctl -w fs.inotify.max_user_watches="99999999"

sysctl -w fs.inotify.max_user_instances="65535"

vi /etc/sysctl.conf #添加以下代码

fs.inotify.max_queued_events=99999999

fs.inotify.max_user_watches=99999999

fs.inotify.max_user_instances=65535

:wq! #保存退出

参数说明:

max_queued_events:

inotify队列最大长度,如果值太小,会出现"** Event Queue Overflow **"错误,导致监控文件不准确

max_user_watches:

要同步的文件包含多少目录,可以用:find /home/www.osyunwei.com -type d | wc -l 统计,必须保证max_user_watches值大于统计结果(这里/home/www.osyunwei.com为同步文件目录)

max_user_instances:

每个用户创建inotify实例最大值

二、创建实时监控脚本

mkdir -p /home/inotify #创建目录

vi /home/inotify/inotif.sh #编辑

#!/bin/sh

/usr/local/inotify/bin/inotifywait -mrq -e modify,create,move,delete --fromfile '/home/inotify/excludedir' --timefmt '%y-%m-%d %H:%M' --format '%T %f %e'

/home/web/osyunwei.com/ >> /tmp/rsync.txt

:wq! #保存退出

vi /home/inotify/excludedir #编辑

/home/web/osyunwei.com/

@/home/web/osyunwei.com/cache/ #排除的目录

:wq! #保存退出

chmod +x /home/inotify/inotif.sh #添加执行权限

vi /etc/rc.d/rc.local #编辑,在最后添加一行,开机自动执行

sh /home/inotify/inotif.sh

:wq! #保存退出

如果/home/web/osyunwei.com/目录下面有任何文件发送变化,/tmp/rsync.txt文件中都会记录。

至此,Linux下用inotify-tool实时监控服务器文件完成。

方法二

inotify-tools是linux下通过inotify机制监控文件变化的命令行工具,可实时监控服务器文件变化并记录,如果服务器出现问题可协助查找原因,安装要求内核大于2.6.13。

查看服务器是否符合安装要求:

uname -a
Linux centos5.7-x64 2.6.18-274.17.1.el5

ll /proc/sys/fs/inotify/
-rw-r--r-- 1 root root 0 05-15 01:12 max_queued_events
-rw-r--r-- 1 root root 0 05-15 01:12 max_user_instances
-rw-r--r-- 1 root root 0 05-15 01:12 max_user_watches

服务器如有安装EPEL源可使用yum安装:

yum install inotify-tools

编译安装:

cd /usr/local/src/
wget --no-check-certificate https://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
tar zxvf inotify-tools-3.14.tar.gz 
cd inotify-tools-3.14
./configure
make
make install
ldconfig -v

inotify相关参数:

/proc/sys/fs/inotify/max_queued_events  #请求events数的最大值
/proc/sys/fs/inotify/max_user_instances #每个user可创建的instances数量上限
/proc/sys/fs/inotify/max_user_watches   #可监控的目录最大数
inotifywait是一个监控等待事件,可配合shell实时监控记录文件系统,常用参数:

--timefmt 时间格式
%y年 %m月 %d日 %H小时 %M分钟
--format 输出格式
%T时间 %w路径 %f文件名 %e状态
-m 始终保持监听状态,默认触发事件即退出。
-r 递归查询目录
-q 打印出监控事件
-e 定义监控的事件,可用参数:
open   打开文件
access 访问文件
modify 修改文件
delete 删除文件
create 新建文件
attrb  属性变更
应用示例:
实时监控wwwroot目录下新建或修改的文件并输出:
 
inotifywait -mrq -e modify,create --timefmt '%y-%m-%d %H:%M' --format '%T %f %e' /home/wwwroot/

输出如下:
 
12-05-14 20:43 favicon.ico
12-05-14 20:43 favicon.ico
12-05-14 20:43 tab_console_down.gif
12-05-14 20:43 tab_console_down.gif
12-05-14 20:43 tab_graphs.gif
12-05-14 20:43 tab_graphs.gif

我采用方法二,参考博文2 后台执行。

监控文件没有问题,但是我想让监控外修改监控目录下文件的权限,修改 inotif.sh

#!/bin/sh

/usr/local/inotify/bin/inotifywait -mrq -e modify,create,move,delete --fromfile '/www/web/everyday_interval/excludedir' --timefmt '%y-%m-%d %H:%M' --format '%T %f %e' /www/web/default/ >> /www/web/everyday_interval/rsync.txt
chown webwww.users /www/web/default/ -R #保证 webwww 对当前目录的所有权限  
webwww_path='/www/web/default'
cd $webwww_path #转到 webwww 默认网站根目录
chown webwww.users * -R #赋予权限

监控记录正常,但是修改目录权限不行!后有参考博文:linux inotify 监控文件系统事件中的方法自定义事件处理脚本 修改后 inotif.sh如下

/usr/local/inotify/bin/inotifywait -mrq --timefmt '%y-%m-%d %H:%M' --format '%T %f %e' -e modify,create,move,delete /www/web/default | while read  date time file event
do
case $event in
MODIFY|CREATE|MOVE|MODIFY,ISDIR|CREATE,ISDIR|MODIFY,ISDIR)
chown webwww.users /www/web/default/ -R #echo $event'-'$file
echo $event'-'$file>>/www/web/everyday_interval/rsync.txt
;;
MOVED_FROM|MOVED_FROM,ISDIR|DELETE|DELETE,ISDIR)
chown webwww.users /www/web/default/ -R #echo $event'-'$file echo $event'-'$file
echo $event'-'$file>>/www/web/everyday_interval/rsync.txt
;;
esac
done

后台执行:

/www/web/everyday_interval/inotif.sh&