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脚本即可实现上传文件。

  • 相关阅读:
    Cypress web自动化7-连接器connectors
    Cypress web自动化6- Assertions断言使用(should, expect)
    Cypress web自动化5-table表格元素(别名使用Aliasing)
    Cypress web自动化4-操作页面元素(Actions行为事件)
    Cypress web自动化3- 登录web网站案例脚本
    Cypress web自动化2-pycharm写第一个脚本
    MapReduce实现手机上网流量分析(业务逻辑)
    Cannot initialize Cluster. Please check your configuration for mapreduce.framework.name and the co
    Input path does not exist: file:/.......
    基于Maven引入Hadoop包报Missing artifact jdk.tools:jdk.tools:jar:1.6
  • 原文地址:https://www.cnblogs.com/wsjhk/p/8351130.html
Copyright © 2011-2022 走看看