zoukankan      html  css  js  c++  java
  • [记录]inotifywait+rsync脚本和sersync2服务检测的脚本

    1)inotifywait+rsync脚本:

    #!/bin/bash src=/data/ # 需要同步的源路径 des=data # 目标服务器上 rsync --daemon 发布的名称,rsync --daemon这里就不做介绍了,网上搜一下,比较简单。 rsync_passwd_file=/etc/rsyncd.passwd # rsync验证的密码文件 ip1=192.168.0.18 # 目标服务器1 ip2=192.168.0.19 # 目标服务器2 user=root # rsync --daemon定义的验证用户名 cd ${src} # 此方法中,由于rsync同步的特性,这里必须要先cd到源目录,inotify再监听 ./ 才能rsync同步后目录结构一致,有兴趣的同学可以进行各种尝试观看其效果 /usr/local/bin/inotifywait -mrq --format '%Xe %w%f' -e modify,create,delete,attrib,close_write,move ./ | while read file # 把监控到有发生更改的"文件路径列表"循环 do INO_EVENT=$(echo $file | awk '{print $1}') # 把inotify输出切割 把事件类型部分赋值给INO_EVENT INO_FILE=$(echo $file | awk '{print $2}') # 把inotify输出切割 把文件路径部分赋值给INO_FILE echo "-------------------------------$(date)------------------------------------" echo $file #增加、修改、写入完成、移动进事件 #增、改放在同一个判断,因为他们都肯定是针对文件的操作,即使是新建目录,要同步的也只是一个空目录,不会影响速度。 if [[ $INO_EVENT =~ 'CREATE' ]] || [[ $INO_EVENT =~ 'MODIFY' ]] || [[ $INO_EVENT =~ 'CLOSE_WRITE' ]] || [[ $INO_EVENT =~ 'MOVED_TO' ]] # 判断事件类型 then echo 'CREATE or MODIFY or CLOSE_WRITE or MOVED_TO' rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} && # INO_FILE变量代表路径哦 -c校验文件内容 rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${des} #仔细看 上面的rsync同步命令 源是用了$(dirname ${INO_FILE})变量 即每次只针对性的同步发生改变的文件的目录(只同步目标文件的方法在生产环境的某些极端环境下会漏文件 现在可以在不漏文件下也有不错的速度 做到平衡) 然后用-R参数把源的目录结构递归到目标后面 保证目录结构一致性 fi #删除、移动出事件 if [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]] then echo 'DELETE or MOVED_FROM' rsync -avzR --delete --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} && rsync -avzR --delete --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${des} #看rsync命令 如果直接同步已删除的路径${INO_FILE}会报no such or directory错误 所以这里同步的源是被删文件或目录的上一级路径,并加上--delete来删除目标上有而源中没有的文件,这里不能做到指定文件删除,如果删除的路径越靠近根,则同步的目录月多,同步删除的操作就越花时间。这里有更好方法的同学,欢迎交流。 fi #修改属性事件 指 touch chgrp chmod chown等操作 if [[ $INO_EVENT =~ 'ATTRIB' ]] then echo 'ATTRIB' if [ ! -d "$INO_FILE" ] # 如果修改属性的是目录 则不同步,因为同步目录会发生递归扫描,等此目录下的文件发生同步时,rsync会顺带更新此目录。 then rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} && rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${des} fi fi done

      

    2)sersync2实时监控目录同步服务进程监控脚本check_sersync2.sh:

    #!/bin/bash
    
    usage() {
        echo -e "
      Usage:  $0 sersync_config_file"
        echo -e "
    Example:  $0 /usr/local/sersync/confxml.xml
    "
        exit -1
    }
    
    if [ $UID -ne 0 ]; then
        echo -e "
    You should run "$0 $@" as root.
    "
        exit -1
    fi
    
    if [ $# -ne 1 ] || [ ! -f $1 ] ; then
        usage
    fi
    
    DAEMON="/usr/local/sersync/sersync2"
    CONFIG_FILE=$1
    LOG_FILE="/var/log/check_sersync.log"
    ARGS="-o $CONFIG_FILE -d"
    
    function start() {
        echo "$DAEMON $ARGS"
        $DAEMON $ARGS >/dev/null 2>&1
        sleep 3
        processes_num=$(status)
        if [ $processes_num -eq '1' ]; then
            log $LOG_FILE "sersync service start success."
        else
            log $LOG_FILE "sersync service start failed."
        fi
    }
    
    function stop() {
        ps aux | grep -v grep | grep "${DAEMON}.*${CONFIG_FILE}" | awk '{printf "%s ",$2}' | xargs kill -9
        processes_num=$(status)
        if [ $processes_num -eq '0' ]; then
            log $LOG_FILE "sersync service stop success."
        else
            log $LOG_FILE "sersync service stop failed."
        fi
    }
    
    function status() {
        processes_num=`ps aux | grep -v grep | grep "${DAEMON}.*${CONFIG_FILE}" -wc`
        echo $processes_num
    }
    
    function log() {
        current_time=`date +"%Y-%m-%d %H:%M:%S"`
        echo [$current_time] $CONFIG_FILE: $2>>$1
    }
    
    processes_num=$(status)
    case "$processes_num" in
        0)
            log $LOG_FILE "sersync service was died."
            start
            ;;
        1)
            log $LOG_FILE "sersync service is running."
            ;;
        *)
            log $LOG_FILE "the system has launched $processes_num of the same sersync process."
            stop
            start
            ;;
    esac
    

      

    添加crontab任务执行:*/1 * * * * root /bin/bash /check_sersync2.sh /conf_tongbu.xml &

    以下这个和check_sersync2.sh脚本类似,也是监控sersync服务的,相互对比一下:

    #!/bin/bash
    # usage:
    #       1.将脚本命名为checksersync.sh
    #       2 chmod +x checkrsync.sh 给脚本赋予可执行权限
    #       2.添加到计划任务
    #       */1 * * * * /root/checksersync.sh
    
    
    logfile='/etc/sersync/checksersync.log';
    
    function sersync_is_running(){
            threadnum=`ps aux|grep sersync2|grep -v grep -wc`;      #此处为监控sersync的监控手段,查找sersync2进程
            if [ "$threadnum" -eq '0' ];then
                    echo '0';
            else
                    echo '1';
            fi
            return;
    }
    
    function current_time(){
            if [ -z "$1" ];then
                    format="%Y-%m-%d %H:%M:%S%Z";
            else
                    format=$1;
            fi
            echo `date +"$format"`;
            return;
    }
    
    function logtofile(){
            echo $(current_time) $2>>$1;
    }
    
    function sersync_restart(){
            /etc/sersync/sersync2 -r -d -o /etc/sersync/confxml.xml >/dev/null 2>&1;
            sleep 3;
    
            threadnum=$(sersync_is_running);
            if [ $threadnum -eq '0' ]; then
                    echo "0";
            else
                    echo '1';
            fi
            return;
    }
    
    isrunning=$(sersync_is_running);
    
    mailzt=`cat $logfile|tail -1 > /etc/sersync/body.txt`
    
    if [ "$isrunning" -eq '0' ];then
            logtofile $logfile "mail sersync service was died.";
            mail -s "rsync sersync service was died." xxx@xxx.com < /etc/sersync/body.txt
    
            restart=$(sersync_restart);
    
            if [ $restart -eq '0' ];then
                    logtofile $logfile "sersync service restart failed.";
            mail -s "rsync sersync service was died." xxx@xxx.com < /etc/sersync/body.txt
            else
                    logtofile $logfile "sersync service restart success.";
            mail -s "rsync sersync service restart success" xxx@xxx.com < /etc/sersync/body.txt
            fi
    else
            logtofile $logfile "sersync service is running.";
    fi
    
    exit 0;
    

      

     win7使用cwRsync客户端上传文件的方式:

    1.安装cwRsync。

    2.编写bat脚本实现上传:

    cwrsync.bat:

    @echo off
    set RSYNC_HOME=C:Program Files (x86)cwRsyncin
    cd %RSYNC_HOME%
    rsync -avz --password-file='/cygdrive/c/Program Files (x86)/cwRsync/bin/pass.txt' --progress --port=10873 /cygdrive/e/myfiles/test.txt test@192.168.5.3::test

    说明:pass.txt文件存放rsync的密码文件, /cygdrive/e是cwRsync用于指定盘符e盘的方式

    执行cwrsync.bat脚本即可实现上传文件。

  • 相关阅读:
    Lucene in action 笔记 case study
    关于Restful Web Service的一些理解
    Lucene in action 笔记 analysis篇
    Lucene in action 笔记 index篇
    Lucene in action 笔记 term vector
    Lucene in action 笔记 search篇
    博客园开博记录
    数论(算法概述)
    DIV, IFRAME, Select, Span标签入门
    记一个较困难的SharePoint性能问题的分析和解决
  • 原文地址:https://www.cnblogs.com/wsjhk/p/8351130.html
Copyright © 2011-2022 走看看