暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

linux系统inotify的原理和实时监控脚本编写

爱婷如命一生一世 2017-08-16
1437

今天本来是阳光明媚,结果下午三点开始了阴云密布!

坐在工位来分享下linux下的inotify的一些知识点:


在linux运维中,众所周知linux同步文件时,rsync并不能实时的进行数据传送,只能依靠手动的在系统指令交互上输入命令来执行!


为了解决这个手动效率比较低下的问题,可以通过脚本来写定时任务,当然这个定时任务频率只能为每分钟!

因为rsync 自身有个瓶颈:同步数据时,rsync采用核心算法对远程服务器的目标文件进行比对(很耗时),只进行差异同步。而在数据量大(百万,千万的级别)的时候,通过rsync进行备份时,并不能让用户能够实时的查看到自己所上传或者保存的内容!这时,inotify的诞生就会解决实时的备份只变化的内容!可以缓解rsync的不足之处取长补短!


inotify简介:(centos 4版本用不了)

是一种强大的,细粒度的,异步的文件系统事件监控机制。

那么鼎鼎有名的rsync+inotify是如何工作的呢??

当客户端启动inotify进程后,其会监听/fengxin目录,当用户往/fengxin写入inotify-test.txt时,这时,inotify进程就会监控到此写入文件的动作,自然而然的inotify会获取到监控文件内的变化,然后通知rsync服务执行rsync推送或者拉取的操作 rsync -avz /fengxin/inotify-test.txt rsync_backup@192.168.8.188::share的一系列操作!

说白了,inotify就是一个触发的机制!有了变化就会调用。

Inotify的实现需要以下几款软件来支持:

自身 (最常见 取名为inotify)  推荐,这次试验用这个!

sersync (国内封装的国内软件,功能比较强大的,还能有过滤!)

lsyncd 。



此次试验拓扑如下:


接下来,检查各个系统内的 daemon是否正常开启!

检测下服务器之间是否能够正常用rsync同步推送拉取:



在rsync服务正常的前提下我们开始安装inotify服务:

首先要注意的是在安装inotify-tools前请确认系统的内核是否达到了2.6.13,
查看系统内核:(在客户端上配置)

[root@Centos-6 /]# uname -r
2.6.32-431.el6.x86_64
[root@Centos-6 /]#

这里面的3个虚拟文件系统代表着支持inotify。

我会在日后会这些文件做一些调整,尤其是第一个,Inotify监控最大时间的值:调整大一些,属于队列,这里我可以看到默认的是16384


接下来,我就要下载一个inotify的源码包:其中存放工具的位置,在工作中建议不要乱放。

我通过在网上查找:链接地址http://vdisk.weibo.com/s/Ajj_VQmcJlNx

下载下来后,可以通过crt进行上传:

如果在终端上出现:咱们就要考虑下rz和sz这两个命令有没有安装!

在客户端我通过rpm包来检查下是否安装:答案是没有安装!


解决办法:可以通过yum install来安装:核实后,安装成功。

然后我通过上传的方式来安装inotify:


上传文件完毕后,我通过解压此文件来安装:解压一般用这个两个参数, xf(简单实用)


并且在编译时开启config_inotify选项:通过源程序安装就要经过解压-->进到目录里面(指定参数)--->进行编译安装(mak && make install).


调整confifigure :表示将inofity安装的地点:这里我安装到usr/local下去:这种安装程序通常都是C语言程序组成!


因此C程序都需要编译才能应用:

其中 && 的意思为:make成功在执行 make install;Make不成功,make install 就不执行!脚本中编写中会遇到。

安装时,警告可以忽略忽略不计,只要不报错就可以了。


还可以根据echo  $?  (特殊的变量,表示前一个命令是否执行成功!)

 来判定是否安装成功:返回0就代表安装成功:

比如,我输入一个 install ,返回一个1就代表没成功,呵呵!!



用cd ../回到曾经的目录:将安装的文件做一个软连接:目的在于把之前的版本号给去掉。

软连接做完之后一定要检查下!这个颜色的指向就对了。

到此为止,inotify 软件安装完毕。






现在,我切到Inotify的软件安装路径下:里面正常的话应该有4个文件。

其中:

bin算是inotify核心,属于执行命令(二进制)。

include :一个程序,inofity程序所需要的头文件。

lib:动态链接的库文件。

share:帮助文档。

我们完全还可以tree一下其中的文件架构:

其中红框内的两个重要命令需要重点关注下:



inotifywait:我可以查看这个命令的源头

-r --recurisive:递归查询目录

-q --quiet: 安静的意思,打印很少的信息,仅仅打印监控事件的信息。

-m --monitor:始终保持事件监听状态。

-e --exclude :排除文件或目录,不区分大小写。

-t --timeout:指定时间输出的格式。


-e  --event 通过此参数可以指定需要监控的事件

--frommat :打印使用指定的输出类似格式的字符串。


重点说一下:-e --event这个参数,

-e  --event 通过此参数可以指定需要监控的事件 :如下所示

监控内容如下:(英文很重要)..............

        access   文件或者目录被读取。      file or directory contents were read  
        modify     文件或目录内容被修改。file or directory contents were written
        attrib    文件或目录属性被改变。   file or directory attributes changed
        close_write    文件或目录封闭,无论读/写模式。 file or directory closed, after being opened in writeable mode
        close_nowrite   file or directory closed, after being opened in
                        read-only mode
        close      关闭     file or directory closed, regardless of read/write mode
        open       打开事件     file or directory opened


 文件或目录被移动另一个目录或从另一个目录移动至当前目录 :   moved_to        file or directory moved to watched directory
        moved_from      file or directory moved from watched directory
        move          file or directory moved to or from watched directory


        create     文件或目录被创建在当前目录。     file or directory created within watched directory
        delete      文件或目录被删除。    file or directory deleted within watched directory
        delete_self     file or directory was deleted
        unmount    文件系统被卸载。     file system containing file or directory unmounted






用不同的参数测试inotify的功能:


   我在客户端上监控本地的/fengxin的文件夹中创建/删除动作:

监控命令:

/usr/local/inotify-tools-3.14/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e create /fengxin

当然,以上这个命令也是可以简化掉时间的,方便日后用推送,输出当成一个变量就很方便。

监控命令的意思如图所示:

我正在监控客户端本地的/fengxin文件下凡是新建动作的事件,这个时候,光标会一直在闪动,等待事件触发......


我另外打开一个窗口,在服务端的1.189上做给/fengxin目录下新建一个文件xxx.txt,看看会有什么反应?

很明显的,我看到监控屏幕已经出现了很详细的事件汇报打印输出。就连创建目录和文件都会详细的叙述出来。


当然,除了可以监控新增文件之外,还可以对删除的动作进行监控:无非就需要我加一个参数而已。

/usr/local/inotify-tools-3.14/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e create,delete /fengxin  


来测试下在新建和删除的操作下会出现什么样的提示:

这样的话,我测试了两个监听的时间(新建、删除)


添加 close_write这个参数,

命令格式:

/usr/local/inotify-tools-3.14/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e create,delete,close_write /fengxin

首先要注意的的 close-write和 create 有很类似的事件监听效果,如果你单单是创建文件,我又同时添加了create和 close-write 那么,监控提示就会提示两次:

两者区别在于,文件被写入时,只会被close-w触发监控到:





inotify监控脚本演示:


为了运维更加规范,我要养成良好的运维习惯,新建出一个存放脚本的文件路径,并切换到相应的文件路径下,等待下一步的编写脚本操作。




简单的脚本编写,还是尽量用vim ,相比vi 功能会强大一些!(说的更装逼一点,就是vim 编译的脚本可以带颜色..........)

下面我对如何进行监控脚本编写,我先简单介绍下:

开头我们要注意的是一般脚本的打头都是用

#!/bin/sh 作用如图:



具体编写后的脚本如下:(增加了删除)

#!/bin/sh

cmd="/usr/local/inotify-tools-3.14/bin/inotifywait"

$cmd -mrq  --format '%w%f' -e create,delete,close_write /fengxin|\

while read line

do


   rsync -az --delete $line rsync_backup@192.168.8.188::share --password-file=/etc/rsync.passwo

rd

done


编写完脚本后,我们可以利用 sh -x 来查看脚本

-x :代表查看脚本输出过程。

我现在操作的是将客户端下的/fengxin/b.txt文件推送给服务端,并实时进行监控。

我先执行脚本命令,后在客户端上/fengxin下面创建一个a.txt

但是我在操作过程中发现报错了:


经过我的推断:很明显这个报错是由于没有开启 rsync --daemon进程引起的。

我将rsync --danmon开启


由于失败了一次,我在客户端上/fengxin  下 创建一个b.txt 看看有没有被客户端推送到服务端同时在客户端被监控到:

此时,客户端也监控到了推送任务事件:

我很明显的看到了它的输出,创建了一个b.txt,inotify并及时的监控下来。为什么有2次?别忘记了我可是记录了2个事件,一个是新建,二一个是写入!

在服务端确认b.txt被传送过来了。


但是,如果要在客户端删除文件的话,想要同步给服务端时,其实这个脚本并不是很完美!

来看报错截图:例如我想在客户端上删除c.txt 并且同步推送给服务端。


再次查看服务端的/tmp/share文件里的内容:发现c.txt还是存在的!


查看下相关的翻译提示:



针对这个提示,我可以得知在这个编写的脚本中是没有添加一个 delete参数的。因此我要添加一个。


编写好后可以在执行脚本一次:还是报错!


说明这个脚本做的并不是好,不仅仅是缺少参数,还有语法上的而错误。

我超过今天所学的知识点重新写一份循环语句的脚本文件:

#!/bin/bash

#para    (对位)

host01=192.168.8.188     (要同步的主机)

src=/fengxin    (源地址的文件目录)

dst=share   (目标目录是模块名称)

user=rsync_backup     (用户名称)

rsync_passfile=/etc/rsync.password   (密码文件)

inotify_home=/usr/local/inotify-tools-3.14/   (Inotify文件的目录)


#judge      (判断,以下内容已经超过了今天的分享知识点,可以先不用理解,以下的知识点代表的是判断的是以上的用户名密码之类的是否有这个值)

if [ ! -e "$src" ] \

|| [ ! -e "${rsync_passfile}" ] \

|| [ ! -e "${inotify_home}/bin/inotifywait" ] \

|| [ ! -e "/usr/bin/rsync" ];

then

  echo "Check File and Folder"

  exit 9

fi


(这个就是多加了一个attrib这个参数,文件属性)

${inotify_home}/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -

e close_write,delete,create,attrib $src \

| while read line

        do

         cd $src && rsync -aruz -R --delete ./  --timeout=100 $user@$host01::$dst --

password-file=${rsync_passfile} >/dev/null 2>&1

        done

exit 0


我在客户端创建一个d.txt 后,同样的服务端也会同步一个d.txt:


现在,我来操作下在客户端上删除d.txt后,服务端会不会立马同步:

答案是很快就同步了!也不会出现报错了!



其实这个脚本的核心是这个:以后会对这个深入分析





在工作环境中,我们对于脚本的执行是在测试环境下不出错的前提下,是这样对命令输出:让其在后台执行!

其中我们能看到的进程有inotify的进程还有输出的命令。



在实际生产环境中,为了能够使得文件服务同步有更好的抗压能力,我上回说到需要调整inotify里面的3个虚拟文件的值。下面我来看下这三个文件的默认值是多少:(在实际生产环境中,我们都下需要把这些值调整的大一些)


修改值如下:例如可以利用 echo 重定向修改!(可以自己修改的大一些!)

但是用vim 我是修改不了,不说是加锁没加锁都是无法修改!

如图所示:



文章转载自爱婷如命一生一世,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论