【澳门葡京备用网址】rsync完成实时同步,php脚本落成Linux服务器文件监控并邮件提示

引言

本年(贰零壹陆)年底来到A集团了,刚入职的时候可比缺前端fe,就死灰复燃顶了三个月,那段时间学到了诸多前端开发的学问,这几个都以题外话了。期直接触了1个很好用的前端自动化安排工具
——
fis,其中有个小功效特别好用,实时监控文件,然后一起到服务端,大大升高了付出的频率。之后转到后端,发现我们付出测试相同模块的时候平时会油可是生互相覆盖的意况,要么就二个个的复制文件到服务器上,功效分外低下,以前为这么些也支付过2个纯shell版本的自动化监控同步工具文件同步监督工具新生意识纯shell版本的拔取体验和伸张质量非凡差,就支付了那篇文章所要介绍的php版本。

本次支付了二个正式的php composer包,使用的时候直接require即可。

引言

现年(二〇一四)年终赶到A集团了,刚入职的时候可比缺前端fe,就死灰复燃顶了八个月,那段日子学到了无数前端开发的文化,那些都以题外话了。期直接触了壹个很好用的前端自动化计划工具
——
fis,其中有个小功用越发好用,实时督查文件,然后一并到服务端,大大升高了支付的频率。之后转到后端,发现大家付出测试相同模块的时候时不时见面世彼此覆盖的图景,要么就2个个的复制文件到服务器上,功效万分低下,从前为这一个也花费过三个纯shell版本的自动化监控同步工具文件同步监督工具新兴发觉纯shell版本的运用体验和扩充质量相当差,就开发了这篇小说所要介绍的php版本。

【澳门葡京备用网址】rsync完成实时同步,php脚本落成Linux服务器文件监控并邮件提示。这一次支付了多个正规的php composer包,使用的时候间接require即可。

inotify-tools + php脚本达成Linux服务器文件监控并邮件提示,

  需要简介:

 
由于服务器被挂马,平时被写入涉敏感的html网页,领导平常被网监请去喝茶,呵呵你懂的。所以有三个需求,一是找出服务器的木马后门和修补代码漏洞,二是监控服务器涉及增删改查的文书。

  第三个不在此次探究行列,故只说第②个要求。

  inotify简介:

   Inotify 是一个Linux脾气,它监控文件系统操作,比如读取、写入和成立。Inotify
反应灵敏,用法极度不难,并且比 cron 职分的农忙轮询高效得多。学习怎么将
inotify
集成到你的应用程序中,并发现一组可用来尤其自动化系统治理的命令行工具。(来自百度百科
inotify)

  inotify-tools是简化使用inotify服务的一种工具。

  以下,大家起头设置inotify-tools。

  服务器系统:centos 6.5   文件目录:/data/rise  
完毕目的:当/data/rise目录下任何公文发生变化时,记录日志并保存。    
具体操作:
  一、安装inotify-tools工具  
一 、查看服务器内核是还是不是辅助inotify服务     命令:ll
/proc/sys/fs/inotify   #列出文件目录,出现上面内容,表明服务器协理  
澳门葡京备用网址 1  
备注:Linux下帮忙inotify的木本最小为2.6.13,可以输入命令 [ uname -a ]
查看,centOS 5.x 内核为2.6.32,暗中同意已经支撑inotify  
澳门葡京备用网址 2  
2、安装inotify-tools工具  

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

    inotify-tools下载地址:点本人下载    
上传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   #安装

  三 、设置环境变量  

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

  ④ 、修改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   #创建目录

vim /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'
/data/rise/ >> /tmp/rsync.txt

wq!     #保存退出

vim /home/inotify/excludedir    #编辑并添加以下内容

 /data/rise/     #要监控的目录
 @/data/rise/cache/   #要排除监控的目录

wq!     #保存退出

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

vim /etc/rc.d/rc.local      #编辑并在最后一行添加以下内容,开机自动启动

  sh /home/inotify/inotif.sh

wq!     #保存退出

reboot重启生效

③ 、直接运用手动执行命令(不想创造脚本可以走这一步)  
切换成有inotifywait的目录下或直接在指令中添加文件路径。
澳门葡京备用网址 3  
命令如下:

/usr/local/inotify/bin/inotifywait  -m -r -d -o /tmp/file_change.log  --timefmt '%F %T' --format '%T %w%f %e'  -e close_write -e create  /data/riseweb/   @/data/riseweb/data/  @/data/riseweb/riseimg/

一声令下解析:

/tmp/file_change.log 是日志路径,生成的日志写在这里面。

/data/riseweb/ 是监控的文件目录,后面两个@是要排除监控的目录。

肆 、使用PHP脚本监测并发送邮件

兑现思路:

 
在/tmp文件夹下新建一个row_mark.txt的文书,用来保存上一遍的file_change.log的最终行数,在crontab中定时执行php脚本,获取file_change.log的终极行数,与row_mark文件最终保存的行数做相比较,数字同样,表达没有新增操作日志。不等同,表明有新增操作日志,读取新行数与旧行数之间的日记内容,排版发送邮件,并把新行数写入row_mark.txt文件。

兑现的php脚本代码:

<?php
/**
 * Created by PhpStorm.
 * User: jimmyRen
 * Date: 16/10/24
 * Time: 下午1:56
 * 主要作用:检查服务器项目目录下是否有新建文件或文件夹,如果有,发送邮件通知
 * 实现思路:服务器如有新建文件,inotify会写在/tmp/file_change.log里,打开文件,获取最后一行的行数,如果大于0或大于上一次保存的行数,则追加写进行数文件中,并发送邮件通知
 */

require_once(dirname(__FILE__)."/include/common.inc.php");
date_default_timezone_set("PRC");
$url = '/tmp/';
//打开日志文件
$change_log = file_get_contents($url.'file_change.log');
//打开记录行数的文件
$row_log = file_get_contents($url.'row_mark.log');
//将文件以每行转换成数组
$change_array = explode("\n",$change_log);
$row_array = explode("\n",$row_log);
//获取数组的总长度
$change_count = count($change_array);
$row_count = count($row_array);
//获取日志文件最后一行的key[行数]
$change_row = $change_count - 2;
//获取行数文件最后一行的值
$row_value = substr($row_array[$row_count-1],0,strpos($row_array[$row_count-1],"["));

$row_date = date("Y-m-d H:i:s",time());
if($change_row > 0 && $row_log== ""){//第一次写行数日志
    $file_write = file_put_contents($url.'row_mark.log',$change_row."[".$row_date."]",FILE_APPEND);
    echo "首次写入记录成功";exit;
}elseif($change_row > 0 && $change_row > $row_value){
    $file_write2 = file_put_contents($url.'row_mark.log',"\n".$change_row."[".$row_date."]",FILE_APPEND);
}else{
    echo "当前时间".date("Y-m-d H:i:s", time())."  没有新写入的文件";
    exit;
}

//有新写入的行数,把日志新写入的内容循环取出来,生成文件,然后发送email
if($file_write2){
    ini_set("memory_limit","512M");
    $new_array = array();
    for($i = $row_value;$i<$change_row;$i++){
        $new_array[] = "\n\r\n".$change_array[$i];
    }
    //把拿到的数组转换成行数格式的字符串
    $text = implode("\n\r\n",$new_array);
    $file_time = date("Y-m-d_H:i");
    //把内容生成文件
    $file = fopen($url."checkChangeLog".$file_time.".txt","w+");
    if($file){
        iconv("UTF-8","GB2312//IGNORE",$text);
        $write = fwrite($file,$text);
    }
    fclose($file);

    //发送邮件
    function sendmail($email, $mailtitle, $mailbody)
    {
        global $cfg_sendmail_bysmtp, $cfg_smtp_server, $cfg_smtp_port, $cfg_smtp_usermail, $cfg_smtp_user, $cfg_smtp_password, $cfg_adminemail,$cfg_webname;
        if($cfg_sendmail_bysmtp == 'Y' && !empty($cfg_smtp_server))
        {
            $mailtype = 'TXT';
            require_once(DEDEINC.'/mail.class.php');
            $smtp = new smtp($cfg_smtp_server,$cfg_smtp_port,true,$cfg_smtp_usermail,$cfg_smtp_password);
            $smtp->debug = false;
            if(!$smtp->smtp_sockopen($cfg_smtp_server)){
                ShowMsg('邮件发送失败,请联系管理员','-1');
                exit();
            }
            $smtp->sendmail($email,$cfg_webname,$cfg_smtp_usermail, $mailtitle, $mailbody, $mailtype);
        }else{
            @mail($email, $mailtitle, $mailbody, $headers);
        }
    }

    $email = "906691xxx.qq.com";  //这里填写要发送到的邮箱
    $mailtitle = date("Y-m-d H:i", time())." rise文件写入情况";
    $mailbody = $text;
    sendmail($email, $mailtitle, $mailbody);
    echo "脚本执行成功!";exit;

}

tip:记得加载发送邮件的class。 

伍 、crontab定时任务

  必要是每一天的0 – 7点,每两个钟头实施一遍,7 –
21点,每3个小时实施一次,21 –
23点,每1个钟头实施一次,故crontab脚本命令如下。

#定时检查服务器文件写入情况并发送邮件通知
0 0-7/5,7-21/1,21-23/2 * * *  php /data/rise/checkfile.php

六、总结

 
要求必然是兑现了,由于不是专业的运转,这次只是落成了须要,大神们有更好的点子可交换商讨。

澳门葡京备用网址 4

+
php脚本完成Linux服务器文件监控并邮件提示, 须求简介:
由于服务器被挂马,平日被写入涉敏感的html网页,领导日常被网监请…

inotify+rsync完成实时同步,inotifyrsync

实现

php版本的落到实处沿用了shell版本的合计,通过管道命令传递shell命令的结果,然后对结果做各样处理,达到大家监控文件的目标。

为了成功那些功效,首先要贯彻二个php版本的管道命令,那里自个儿对resource popen ( string $command , string $mode )做了打包,可以经过很融洽的拍卖命令的再次回到值。

成功了地点的模块,接下去就是现实的贯彻了,落成那里有多重本身的不二法门,添加多路径递归监控、包蕴正则匹配、排除正则匹配。

实现

php版本的已毕沿用了shell版本的思索,通过管道命令传递shell命令的结果,然后对结果做各样处理,达到我们监控文件的目的。

为了形成那些职能,首先要促成五个php版本的管道命令,那里本身对resource popen ( string $command , string $mode )做了包装,可以因此很融洽的处理命令的重回值。

成就了地点的模块,接下去就是现实的完毕了,达成那里有多重本人的不二法门,添加多路径递归监控、包罗正则匹配、排除正则匹配。

第壹章 数据实时同步介绍

pipe的开发

<?php
/**
 * php对对popen的封装,通过回调的方式模拟管道命令
 *
 */
namespace Aizuyan\Pipe;
class Pipe
{
    /**
     * 要通过管道执行的命令
     */
    protected $command = "";
    /**
     * 回调函数,将管道数据传递给该函数
     */
    protected $callback = null;
    /**
     * 数据之间的分隔符
     */
    protected $delimiter = "\n";
    /**
     * 设置命令
     *
     * @param cmd string 要运行的命令
     */
    public function setCmd($cmd)
    {
        $this->command = $cmd;
        return $this;
    }
    /**
     * 设置回调函数,处理管道输出的命令
     */
    public function setCallback(callable $cb)
    {
        $this->callback = $cb;
        return $this;
    }
    /**
     * 设置数据片段之间的分隔符
     */
    public function setDelimiter($delimiter)
    {
        $this->delimiter = $delimiter;
        return $this;
    }
    /**
     * 开始运行
     */
    public function run()
    {
        $fp = popen($this->command, "r");
        if (false === $fp) {
            throw new \RuntimeException("popen execute command failed!");
        }
        $item = "";
        while (!feof($fp)) {
            $char = fgetc($fp);
            if ($this->delimiter == $char) {
                call_user_func($this->callback, $item);
                $item = "";
            } else {
                $item .= $char;
            }
        }
        pclose($fp);
    }
}

上面是测试程序

<?php
include "vendor/autoload.php";
$test = new \Ritoyan\Pipe\Pipe();
$test->setCmd("tail -f /root/t.txt")->setCallback(function($item){
        echo "获取内容:" . $item . "\n";
})->setDelimiter("\n")->run();

tail -f /root/t.txt其一shell命令的归来结果举行实时处理,setCallback(callable func)安装了回调函数,func的参数是shell命令的业内输出,setDelimiter($delimiter)设置了传播回调函数参数的分隔符,那样就可以很不难、很自由的将出口传递给回调函数了。

pipe的开发

<?php
/**
 * php对对popen的封装,通过回调的方式模拟管道命令
 *
 */
namespace Aizuyan\Pipe;
class Pipe
{
    /**
     * 要通过管道执行的命令
     */
    protected $command = "";
    /**
     * 回调函数,将管道数据传递给该函数
     */
    protected $callback = null;
    /**
     * 数据之间的分隔符
     */
    protected $delimiter = "\n";
    /**
     * 设置命令
     *
     * @param cmd string 要运行的命令
     */
    public function setCmd($cmd)
    {
        $this->command = $cmd;
        return $this;
    }
    /**
     * 设置回调函数,处理管道输出的命令
     */
    public function setCallback(callable $cb)
    {
        $this->callback = $cb;
        return $this;
    }
    /**
     * 设置数据片段之间的分隔符
     */
    public function setDelimiter($delimiter)
    {
        $this->delimiter = $delimiter;
        return $this;
    }
    /**
     * 开始运行
     */
    public function run()
    {
        $fp = popen($this->command, "r");
        if (false === $fp) {
            throw new \RuntimeException("popen execute command failed!");
        }
        $item = "";
        while (!feof($fp)) {
            $char = fgetc($fp);
            if ($this->delimiter == $char) {
                call_user_func($this->callback, $item);
                $item = "";
            } else {
                $item .= $char;
            }
        }
        pclose($fp);
    }
}

上边是测试程序

<?php
include "vendor/autoload.php";
$test = new \Ritoyan\Pipe\Pipe();
$test->setCmd("tail -f /root/t.txt")->setCallback(function($item){
        echo "获取内容:" . $item . "\n";
})->setDelimiter("\n")->run();

tail -f /root/t.txt其一shell命令的回来结果进行实时处理,setCallback(callable func)安装了回调函数,func的参数是shell命令的正规输出,setDelimiter($delimiter)安装了传播回调函数参数的分隔符,那样就足以很简单、很自由的将出口传递给回调函数了。

1.1 什么是实时同步:如何兑现实时同步

A. 要拔取监控服务(inotify),监控同步数据服务器目录中音讯的更动

B. 发现目录中多少爆发变化,就选用rsync服务推送到备份服务器上

inotify开发

这一部分代码就不提议来了,主要就是依靠地方的Pipe然后对inotifywait -mrq --format '%w,%e,%f'一声令下的出口做处理,正向逆向过滤,上边是对Inotify的调用

<?php
require "vendor/autoload.php";
$obj = new Aizuyan\Inotify\Inotify();
$obj->addExclude([
    "/swp$/",
    "/swpx$/",
    "/~$/",
    "/\d$/",
    "/swx$/"
])->setCallback(function ($item){
    echo $item["event"] . " 文件 " . $item["file"] . "\n";
})->addPaths("/datas/git/")->start();

这么运维之后,到大家修改/datas/git目录下的文书的时候会输出上面的内容,可以很有利的对修改文件做定制化的处理

CREATE 文件 /datas/git/inotify/README.md
MODIFY 文件 /datas/git/inotify/README.md
MOVED_TO 文件 /datas/git/aizuyan/pinyin-1/README.md
DELETE 文件 /datas/git/aizuyan/pinyin-1/LICENSE
......

inotify开发

这有个别代码就不提议来了,首要就是凭借地点的Pipe然后对inotifywait -mrq --format '%w,%e,%f'指令的出口做处理,正向逆向过滤,上面是对Inotify的调用

<?php
require "vendor/autoload.php";
$obj = new Aizuyan\Inotify\Inotify();
$obj->addExclude([
    "/swp$/",
    "/swpx$/",
    "/~$/",
    "/\d$/",
    "/swx$/"
])->setCallback(function ($item){
    echo $item["event"] . " 文件 " . $item["file"] . "\n";
})->addPaths("/datas/git/")->start();

如此那般运维之后,到我们修改/datas/git目录下的公文的时候会输出下边的始末,可以很便利的对修改文件做定制化的处理

CREATE 文件 /datas/git/inotify/README.md
MODIFY 文件 /datas/git/inotify/README.md
MOVED_TO 文件 /datas/git/aizuyan/pinyin-1/README.md
DELETE 文件 /datas/git/aizuyan/pinyin-1/LICENSE
......

1.2 完结实时手拉手的办法

 inotify+rsync 格局贯彻多少同步

 sersync 格局贯彻实时数据同步

inotify-tools安装

全套职能依赖于多个linux软件 —— inotify-tools
centos安装yum install inotify-tools,大概通过源码直接设置(文档)品味在OS中装置,发现失利了~

inotify-tools安装

整个职能依赖于3个linux软件 —— inotify-tools
centos安装yum install inotify-tools,可能经过源码直接设置(文档)尝试在OS中设置,发现失利了~

1.2.1 实时同步原理介绍

澳门葡京备用网址 5

怎么利用

自家早就将她发布到了composer仓库中,可以轻松安装:
composer require aizuyan/inotify,之后就足以像上边的事例一样选用了

其它那是支付的七个零件的github地址:Aizuyan\Pipe\Pipe
, Aizuyan\Inotify\Inotify

怎么着运用

本人一度将她颁发到了composer仓库中,可以轻松安装:
composer require aizuyan/inotify,之后就可以像上面的例证一样使用了

其余那是开发的三个零部件的github地址:Aizuyan\Pipe\Pipe
, Aizuyan\Inotify\Inotify

1.3 inotify+rsync 形式贯彻多少同步

1.3.1 Inotify简介

Inotify是一种强大的,细粒度的。异步的文件系统事件监控机制,linux内核从2.6.13起,到场了
Inotify辅助,通过Inotify可以监督文件系统中添加、删除,修改、移动等各个风浪,利用那几个基本接口,第2方软件就足以监控文件系统下文件的各样变化情况,而
inotify-tools
正是实施如此监控的软件。国人周洋在金山公司也支付了近似的实时同步软件sersync。

提醒音讯:

sersync软件其实就是在 inotify软件基础上进展支付的,成效要更为强劲些
,多了定时重传机制,过滤机制了提供接口做 CDN,支持多线程橾作。

Inotify实际是一种事件驱动机制,它为应用程序监控文件系统事件提供了实时响应事件的建制,而无须通过诸如cron等的轮询机制来取得事件。cron等体制不仅不可能做到实时性,而且消耗多量系统资源。比较之下,inotify基于事件驱动,可以成功对事件处理的实时响应,也未尝轮询造成的系统能源消耗,是越发自然的轩然大波通报接口,也与自然世界事件机制相适合。

inotify的完成有两款软件:

inotify-tools,sersync,lrsyncd

1.3.2 inotify+rsync使用方法

inotify 对一起数据目录音讯的监察

rsync  完毕对数码新闻的实时同步

运用脚本举办结合

1.4 安顿inotify软件的前提

亟需2.6.13之后基本版本才能协助inotify软件。2.6.13根本之后版本,在并未设置inotify软件从前,应该有那多少个公文。

[[email protected] ~]# ll /proc/sys/fs/inotify/
total 0
-rw-r--r-- 1 root root 0 Oct 17 10:12 max_queued_events
-rw-r--r-- 1 root root 0 Oct 17 10:12 max_user_instances
-rw-r--r-- 1 root root 0 Oct 17 10:12 max_user_watches

1.4.1 多个主要文件的求证

文件

默认值

作用说明

max_user_watches

8192

设置inotifywait或inotifywatch命令可以监视的文件数量(单进程)

max_user_instances

128

设置每个用户可以运行的inotifywait或inotifywatch命令的进程数

max_queued_events

16384

设置inotify实例事件(event)队列可容纳的事件数量

1.4.2 【服务优化】可以将三个公文的数值调大,监听更大的限量

1.4.3 【官方认证】多少个首要文件

[[email protected] ~]# man proc
/proc/sys/fs/inotify (since Linux 2.6.13)
       This   directory   contains    files    max_queued_events,
       max_user_instances, and max_user_watches, that can be used
       to limit the amount of kernel memory consumed by the  inotify interface. 
for further details, see inotify(7).

由此man手册的第9级别中查到 inotify的暗中同意文件的详细表明。

[[email protected] ~]# man 7 inotify
/proc/sys/fs/inotify/max_queued_events
       The  value  in this file is used when an application calls
       inotify_init(2) to set an upper limit  on  the  number  of
       events  that  can  be  queued to the corresponding inotify
       instance.  Events in excess of this limit are dropped, but
       an IN_Q_OVERFLOW event is always generated.

/proc/sys/fs/inotify/max_user_instances
       This  specifies  an  upper  limit on the number of inotify
       instances that can be created per real user ID.

/proc/sys/fs/inotify/max_user_watches
       This specifies an upper limit on  the  number  of  watches
       that can be created per real user ID.

1.5 inotify软件介绍及参数表达

1.5.1 三种安装方式

1) yum install -y inotify-tools

2) 手工编译安装

注:

    YUM 安装需求有epel源

http://mirrors.aliyun.com

手工编译安装方式索要到github上开展下载软件包

    inotify软件的参考资料链接:

https://github.com/rvoicilas/inotify-tools/wiki

1.5.2 inotify主要安装的多少个软件

澳门葡京备用网址 ,inotifywait: (主要)

 在被监督的公文或目录上等待特定文件系统事件(open close
delete等)发生,执行后处于阻塞状态,适合在shell脚本中行使

inotifywatch:

采访被监督的文件系统使用的总结数据,指文件系统事件爆发的次数总括。

表明:在实时实时同步的时候,紧假如采取inotifywait对目录进行督察

1.5.3 inotifywait命令参数表明

参数

含义

-m, –monitor

(重要参数)

Keep listening for events forever.  Without this option, inotifywait will exit after one event is received.

始终保持事件监听。

-d, –daemon

111

-r, –recursive

(重要参数)

Watch all subdirectories of any directories passed as arguments.

递归监控目录数据信息变化

-o, –outfile <file>

Print events to <file> rather than stdout.

打印事件到文件中,相当于标准正确输出

-s, –syslog

Output errors to syslog(3) system log module rather than stderr.

发送错误到syslog相当于标准错误输出

-q, –quiet

(重要参数)

If specified once, the program will be less verbose.  Specifically, it will not state  when  it  has  completed establishing all inotify watches.

输出信息少(只打印事件信息)

–exclude <pattern>

Exclude all events on files matching the extended regular expression <pattern>.

排除文件或目录

–excludei <pattern>

Like –exclude but case insensitive.

排除文件或目录时,不区分大小写

–timefmt <fmt>

(重要参数)

Print using a specified printf-like format string; read the man page for more details.

指定时间输出格式

–format <fmt>

(重要参数)

Print using a specified printf-like formatstring; read the man page for more details.

打印使用指定的输出类似格式字符串;即实际监控输出内容

-e

(重要参数)

Listen for specific event(s).  If omitted, all events are listened for.

指定监听指定的事件,如果省略,表示所有事件都进行监听

以上的信息可以通过 inotifywait –help  获得

1.5.4 -e[参数]  能够钦命的轩然大波类型

事件名称

事件说明

access

file or directory contents were read

文件或目录内容被读取

modify

file or directory contents were writterv

文件或目录内容被写入

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

以上的信息可以通过 inotifywait –help  获得

1.5.4.1 【实例】inotifywait监控中的事件测试

壹 、创立事件

[[email protected] data]# touch test2.txt
[[email protected] ~]# inotifywait -mrq  /data --timefmt "%d-%m-%y %H:%M" --format "%T %w%f 事件信息: %e" -e create
17-10-17 11:19 /data/test2.txt 事件信息: CREATE

② 、删除事件

[[email protected] data]# \rm -f test1.txt
[[email protected] ~]# inotifywait -mrq  /data --timefmt "%d-%m-%y %H:%M" --format "%T %w%f 事件信息: %e" -e delete
17-10-17 11:28 /data/test1.txt 事件信息: DELETE

③ 、修改事件

[[email protected] data]# echo "132" > test.txt
[[email protected] ~]# inotifywait -mrq  /data --timefmt "%d-%m-%y %H:%M" --format "%T %w%f 事件信息: %e" -e close_write
17-10-17 11:30 /data/test.txt 事件信息: CLOSE_WRITE,CLOSE

肆 、移动事件 moved_to

[[email protected] data]# mv /etc/hosts .
[[email protected] ~]# inotifywait -mrq  /data --timefmt "%d-%m-%y %H:%M" --format "%T %w%f 事件信息: %e" -e moved_to
17-10-17 11:33 /data/hosts 事件信息: MOVED_TO

活动事件 moved_from

[[email protected] data]# mv ./hosts  /tmp/
[[email protected] ~]# inotifywait -mrq  /data --timefmt "%d-%m-%y %H:%M" --format "%T %w%f 事件信息: %e" -e moved_from
17-10-17 11:34 /data/hosts 事件信息: MOVED_FROM

1.5.5 inotifywait 参数 –format <fmt>格式定义参数

命令参数

参数说明

%w(重要参数)

事件出现时,监控文件或目录的名称信息

%f(重要参数)

事件出现时,将显示监控目录下触发事件的文件或目录信息,否则为空

%e(重要参数)

显示发生的事件信息,不同的事件信息用逗号进行分隔

%Xe

显示发生的事件信息,不同的事件信息有x进行分隔,可以修改X为指定分隔符

%T(重要参数)

输出时间格式中定义的时间格式信息,通过 –timefmt option 语法格式指定时间信息

这个格式是通过strftime函数进行匹配时间格式信息的

以上的信息可以通过 inotifywait –help  获得

1.5.6 inotifywait 参数–timefmt <fmt>时间格式参数

命令参数

参数说明

%d(重要参数)

The day of the month as a decimal number(range 01 to 31)

每月的第几天,显示倍息为十进制数(范围是 01-31 )

%m(重要参数)

The month as a decimal number (range 01 to 12).

显示月份,显示信息为十进制(范围 01-12 )

%M

The minute as a decimal number (range 00 to 59).

显示分钟,显示信息为十进制(范围 00-59 )

%y(重要参数)

The year as a decimal number without a century (range 00 to 99).

年份信息,显示信息为十进制,并且没有世纪信息

%Y

The year as a decimal number including the century.

年份信息,显示信息为十进制,并且包含世纪信息

%H

The hour as a decimal number using a 24-hour clock (range 00 to 23).

小时信息,显示信息为十进制,使用 24小时制(范围 00-23 )

说明:以上信息可以通过 man strftime信息获取

1.5.6.1 修改出口的日期格式

[[email protected] ~]# inotifywait -mrq  /data --timefmt "%d/%m/%y %H:%M" --format "%T %w%f"
17/10/17 11:12 /data/test1.txt

1.5.7 -e[参数] 首要监控事件参数汇总表:

重要事件

包含事件

备注说明

close

close_write  

close_nowrite

文件或目录关闭,不管读或是写模式

即包含写关闭与读关闭

close_write

create

包含文件创建事件,但不包含目录创建事件

move

moved_to  

moved_from

文件或目录不管移动到或是移动出监控目录都触发事件

即包含信息移入或移出监控目录事件

重要参数汇总:根据以上说明,在实际使用时,只要监控以下事件即可

create 创建、 delete 删除、 movedjto 移入、 close_write 修 改

inotifywait -mrq /data –format "%w%f"  -e create,delete,moved_to,close_write

1.6 对inotifywait命令的测试

对inotifywait命令测试的表明:

   需求打开五个三番五次窗口

1窗口运行inotifywait

2窗口对文件夹举办操作,可在一窗口中查看出inotifywait的督查记录

1.6.1 、创制文件的逻辑↓

[[email protected] ~]# inotifywait /data
Setting up watches.
Watches established.
/data/ CREATE test1.txt
/data/ OPEN test1.txt
/data/ ATTRIB test1.txt
/data/ CLOSE_WRITE,CLOSE test1.txt
创建文件,inotifywait显示创建文件的过程↑
[[email protected] data]# touch test1.txt

1.6.2 制造目录逻辑↓

[[email protected] data]# mkdir testdir
[[email protected] ~]#
/data/ CREATE,ISDIR testdir

1.6.3 监控子目录下的公文↓

[[email protected]nfs01 data]# touch  testdir/test01.txt
[[email protected] ~]# inotifywait -mrq  /data
/data/testdir/ OPEN test01.txt
/data/testdir/ ATTRIB test01.txt
/data/testdir/ CLOSE_WRITE,CLOSE test01.txt

1.6.4 sed命令修改逻辑

[[email protected] data]# sed 's#132#123#g' test.txt -i

[[email protected] ~]# inotifywait -mrq  /data --timefmt "%d-%m-%y %H:%M" --format "%T %w%f 事件信息: %e" -e moved_from
 /data/test.txt 事件信息: OPEN
 /data/sedDh5R8v 事件信息: CREATE
 /data/sedDh5R8v 事件信息: OPEN
 /data/test.txt 事件信息: ACCESS
 /data/sedDh5R8v 事件信息: MODIFY
 /data/sedDh5R8v 事件信息: ATTRIB
 /data/sedDh5R8v 事件信息: ATTRIB
 /data/test.txt 事件信息: CLOSE_NOWRITE,CLOSE
 /data/sedDh5R8v 事件信息: CLOSE_WRITE,CLOSE
 /data/sedDh5R8v 事件信息: MOVED_FROM
 /data/test.txt 事件信息: MOVED_TO

sed命令替换逻辑

  1. 成立目前文件

02.
将原文件内容放置到目前文件中,修改替换一时文件中的内容,原有文件不做更改

  1. 重命名目前文件,覆盖原文件

1.6.5 inotifywait监控中 -e 的参数使用

inotifywait -mrq /data --timefmt "%d/%m/%y %H:%M" --format "%T %w%f 事件信息: %e" -e create

    表明:表示只监听create事件

inotifywait -mrq /data --timefmt "%d/%m/%y %H:%M" --format "%T %w%f 事件信息: %e"

    表达:不点名-e参数,表示监听全部事件

  1. 去除事件delete

    # inotifywait -mrq /data --timefmt "%F %H:%M" --format "%T %w%f 事件信息: %@e" -e delete
    2017-10-17 11:28 /data/02.txt 事件信息: DELETE
    2017-10-17 11:28 /data/03.txt 事件信息: DELETE
    2017-10-17 11:28 /data/04.txt 事件信息: DELETE
    

    03. 修改事件close_write

  # inotifywait -mrq /data --timefmt "%F %H:%M" --format "%T %w%f 事件信息: %@e" -e delete,close_write
    2017-10-17 11:30 /data/oldgirl.txt 事件信息: [email protected]
    2017-10-17 11:30 /data/.oldgirl.txt.swx 事件信息: [email protected]
    2017-10-17 11:30 /data/.oldgirl.txt.swx 事件信息: DELETE
    2017-10-17 11:30 /data/.oldgirl.txt.swp 事件信息: [email protected]
    2017-10-17 11:30 /data/.oldgirl.txt.swp 事件信息: DELETE
    2017-10-17 11:30 /data/.oldgirl.txt.swp 事件信息: [email protected]
    2017-10-17 11:30 /data/.oldgirl.txt.swp 事件信息: DELETE

    04. 运动事件moved_to

    inotifywait -mrq /data --timefmt "%F %H:%M" --format "%T %w%f 事件信息: %@e" -e delete,close_write,moved_to
    2017-10-17 11:34 /data/hosts 事件信息: MOVED_TO

1.7 实时同步命令参数示意图

澳门葡京备用网址 6

第三章 inotify+rsync实时同步服务配置

2.1 第三个里程碑:安排rsync服务

2.1.1 rsync服务端安排

1)软件是不是留存

[[email protected] ~]# rpm -qa |grep rsync
rsync-3.0.6-12.el6.x86_64

须求:查询到有些命令格外实惠。可是不知底属于哪个软件包

    yum provides rysnc 

    provides   Find what package provides the given value

2)举行软件服务配置

[[email protected] ~]# vim /etc/rsyncd.conf
uid = rsync
gid = rsync
use chroot = no
max connections = 200
timeout = 300
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore errors
read only = false
list = false
hosts allow = 172.16.1.0/24
auth users = rsync_backup
secrets file = /etc/rsync.password

[backup]
comment = "backup dir by oldboy"
path = /backup

[nfsbackup]
comment = "nfsbackup dir by hzs"
path = /nfsbackup

3)创设rsync管理用户

[[email protected] ~]# useradd -s /sbin/nologin -M rsync

4)创制数据备份储存目录,目录修改属主

[[email protected] ~]# mkdir /nfsbackup/
[[email protected] ~]# chown -R rsync.rsync /nfsbackup/

5)成立认证用户密码文件并举办授权600

echo "rsync_backup:oldboy123" >>/etc/rsync.password
chmod 600 /etc/rsync.password

6)启动rsync服务

rsync --daemon

时至前些天服务端配置完结

[[email protected] ~]# ps -ef |grep rsync
root       2076      1  0 17:05 ?        00:00:00 rsync --daemon
root       2163   1817  0 17:38 pts/1    00:00:00 grep --color=auto rsync

2.1.2 rsync客户端配置

1)软件是或不是留存

[[email protected] ~]# rpm -qa |grep rsync
rsync-3.0.6-12.el6.x86_64

2)创造平安认证文件,并拓展修改权限600

echo "oldboy123" >>/etc/rsync.password
chmod 600 /etc/rsync.password

3) 测试数据传输

[[email protected] sersync]# rsync -avz /data  [email protected]::nfsbackup  --password-file=/etc/rsync.password
sending incremental file list
data/
data/.hzs
data/.tar.gz
data/.txt

2.2 第二个里程碑:布署inotify服务

率先先认不过不是有epel源用来设置inotify-tools软件

[[email protected] ~]# yum repolist
Loaded plugins: fastestmirror, security
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * epel: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
repo id  repo name                                       status
base     CentOS-6 - Base - mirrors.aliyun.com             6,706
epel     Extra Packages for Enterprise Linux 6 - x86_64  12,401
extras   CentOS-6 - Extras - mirrors.aliyun.com              46
updates  CentOS-6 - Updates - mirrors.aliyun.com            722
repolist: 19,875

2.2.1 安装inotify软件

二种安装形式

1) yum install -y inotify-tools

2) 手工编译安装

注:

手工编译安装方式要求到github上举行下载软件包

    inotify软件的参考资料链接:

2.2.2 查看inotify安装上的七个指令(inotifywait,inotifywatch)

[[email protected] ~]# rpm -ql inotify-tools
/usr/bin/inotifywait      #主要
/usr/bin/inotifywatch

2.2.2.1 inotifywait和inotifywatch的作用:

一共安装了2个工具(命令),即inotifywait和inotifywatch
inotifywait : 在被监控的文件或目录上等待特定文件系统事件(open close delete等)发生,
执行后处于阻塞状态,适合在shell脚本中使用
inotifywatch :收集被监控的文件系统使用的统计数据,指文件系统事件发生的次数统计。
说明:yum安装后可以直接使用,如果编译安装需要进入到相应软件目录的bin目录下使用

#命令 man手册说明
# man inotifywait
inotifywait - wait for changes to files using inotify

使用inotify进行监控,等待产生变化的文件信息
# man inotifywatch
inotifywatch - gather filesystem access statistics using inotify
使用inotify进行监控,收集文件系统访问统计佶息

2.3 第⑩个里程碑:编写脚本,完毕rsync+inotify软件成效结合

2.3.1 rsync服务命令:

rsync -avz --delete /data/ [email protected]::nfsbackup --password-file=/etc/rsync.password

2.3.2 inotify服务命令:

inotifywait -mrq /data -format "%w%f"  -e create,delete,move_to,close_write

2.3.3 编写脚本:

[[email protected] sersync]# vim /server/scripts/inotify.sh
#!/bin/bash
inotifywait -mrq /data --format "%w%f" -e create,delete,moved_to,close_write|\
while read line
do
        rsync -az --delete /data/ [email protected]::nfsbackup --password-
file=/etc/rsync.password
done

剧本表明:

for循环会定义三个口径,当规则不满意时停下循环

while循环:只要条件满意就径直循环下去

2.3.4 对台本举行优化

#!/bin/bash
Path=/data
backup_Server=172.16.1.41
/usr/bin/inotifywait -mrq --format '%w%f' -e create,close_write,delete /data  | while read line  
do
    if [ -f $line ];then
        rsync -az $line --delete [email protected]$backup_Server::nfsbackup --password-file=/etc/rsync.password
    else
        cd $Path &&\
        rsync -az ./ --delete [email protected]$backup_Server::nfsbackup --password-file=/etc/rsync.password
    fi
done

2.4 第10个里程碑:测试编写的剧本

2.4.1 让脚本在后台运营

在/data 目录先创制几个公文

[[email protected] data]# sh  /server/scripts/inotify.sh &
[[email protected] data]# touch {1..6}.txt

在backup服务器上,已经时候共同过去了几个文本。

[[email protected] ~]# ll /nfsbackup/
total 8
-rw-r--r-- 1 rsync rsync 0 Oct 17 12:06 1.txt
-rw-r--r-- 1 rsync rsync 0 Oct 17 12:06 2.txt
-rw-r--r-- 1 rsync rsync 0 Oct 17 12:06 3.txt
-rw-r--r-- 1 rsync rsync 0 Oct 17 12:06 4.txt
-rw-r--r-- 1 rsync rsync 0 Oct 17 12:06 5.txt
-rw-r--r-- 1 rsync rsync 0 Oct 17 12:06 6.txt

2.5 利用while循环语句编写的台本截至方法(kill)

01. ctrl+z暂停程序运行,kill -9杀死
02. 不要暂停程序,直接利用杀手三剑客进行杀进程

 说明:kill多个刀客不是万能的,在经过暂停时,无法杀死;kill -9
(危险)

2.5.1 查看后台都要怎么着程序在运作

[[email protected] data]# jobs
[1]+  Running                 sh /server/scripts/inotify.sh &

2.5.2 fg将后台的顺序调到前台来

[[email protected] data]# fg 1
sh /server/scripts/inotify.sh

2.6 进度的前台和后台运维格局:

    fg    — 前台

    bg    — 后台

2.6.1 脚本后台运市场价格势

    01. sh inotify.sh &
    02. nohup sh inotify.sh &
    03. screen实现脚本程序后台运行

sh /server/scripts/inotify.sh &

nohup

nohup sh inotify.sh &

2.7 screen完结脚本程序后台运营

2.7.1 经过yum查找发现screen命令属于screen包

[[email protected] ~]# yum provides screen
Loaded plugins: fastestmirror, security
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * epel: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
base                                                      | 3.7 kB     00:00    
epel                                                      | 4.3 kB     00:00    
extras                                                    | 3.4 kB     00:00    
updates                                                   | 3.4 kB     00:00    
screen-4.0.3-19.el6.x86_64 : A screen manager that supports multiple logins on
                           : one terminal
Repo        : base
Matched from:

2.7.2 安装screen软件

[[email protected] ~]# yum install -y  screen

2.7.3 screen命令的参数

在shell中输入 screen即可进入screen 视图

[[email protected] ~]# screen

Screen已毕后台运维程序的简练步骤:

  screen -ls :可看screen会话

  screen -r ID :指定进入哪个screen会话

Screen命令中用到的神速键

  Ctrl+a c :创造窗口

  Ctrl+a w :窗口列表

  Ctrl+a n :下1个窗口

  Ctrl+a p :上二个窗口

  Ctrl+a 0-9 :在第0个窗口和第⑨个窗口之间切换

  Ctrl+a K(大写) :关闭当前窗口,并且切换成下2个窗口 ,

(当退出最终五个窗口时,该终端自动终止,并且退回到原始shell状态)

  exit :关闭当前窗口,并且切换来下3个窗口

(当退出最终二个窗口时,该终端自动为止,并且退回到原始shell状态)

  Ctrl+a d :退出当前终端,重回加载screen前的shell命令状态

  Ctrl+a ” : 窗口列表不同于w

2.8 sersync软件完成实时同步

第2章
数据实时同步 介绍 1.1 什么是实时同步:怎么着促成实时同步 A.
要采纳监控服务( inotify ),监控…

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website