博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
重构后的程序:通过rsync命令抓取日志文件
阅读量:6137 次
发布时间:2019-06-21

本文共 4571 字,大约阅读时间需要 15 分钟。

push.sh

#!/bin/bashfunction push(){        local ip=$1        local user=$2        local password=$3        local path=$4        local localPath=$5        local error=$6        :>$error        export RSYNC_PASSWORD="$password"        rsync -Cavz $user@$ip::$path $localPath > $error 2>&1        # 判断是否发送错误        grep "rsync error" $error > $error"_copy"        cp $error"_copy" $error        rm -f $error"_copy"}# serverInfo=([1]="172.18.11.200" [2]="log" [3]="abcabc")# fileInfo=([1]="logs/syslog/project_log.20131226.16" [2]="./lishujun.log" [3]="aaa")# push ${serverInfo[*]} ${fileInfo[*]}

catch.sh

#!/bin/sh. push.sh# 错误处理:尝试查找备份文件function onError(){        local errFile="err"        local serverInfo=($1 $2 $3) # ip username password        local logInfo=($4 $5)       # srcPath destPath        local srcPath=${logInfo[0]}        logInfo[0]="disk1/"${srcPath##*/}".gz" #备份文件路径        logInfo[1]=${logInfo[1]}".gz"        push ${serverInfo[*]} ${logInfo[*]} $errFile        if [ -s $errFile ]; then                echo "the file ${logInfo[0]} was not found"        fi}# 抓取指定日期指定时间的日志文件function catchLogByHour(){        local errFile="err"        local serverInfo=($1 $2 $3) # serverInfo=(ip username password)        local logInfo=($4 $5)       # logInfo=(srcPath destPath)        local endHour=$6        local i=0        while [ $i -le $endHour ];        do                hour=$i                if [ $hour -lt 10 ]; then                        hour="0"$hour                 fi           local hourLogInfo # 声明为局部变量                hourLogInfo[0]=${logInfo[0]}"."$hour                hourLogInfo[1]=${logInfo[1]}"."$hour                push ${serverInfo[*]} ${hourLogInfo[*]} $errFile                if [ -s $errFile ]; then                        onError ${serverInfo[*]} ${hourLogInfo[*]}                fi                i=`expr $[$i+1]`        done}# for test# logDate="20061220"# serverInfo=([1]="172.18.11.200" [2]="log" [3]="abcabc")# logInfo=([1]="logs/syslog/project_log."$logDate [2]="./data/project_log."$logDate [3]="11")# catchLogByHour  ${serverInfo[*]} ${logInfo[*]}

main.sh

#! /bin/shcd `dirname $0`. catch.shif [ $# -eq 0 ]; then        # 取昨天数据        logDate=`date -d"1 day ago" +'%Y%m%d'`        hour=23else        # 取指定日期时间        today=`date +'%Y%m%d'`        logDate=$1        if [ "$1" == "$today" ]; then                # 取当天数据已产生的数据                hour=`date -d "1 hour ago" +"%H"`        else                # 取历史数据                hour=23        fifiserverInfo=([1]="172.18.11.200" [2]="log" [3]="abcabc")logInfo=([1]="logs/syslog/project_log."$logDate [2]="./data/project_log."$logDate [3]=$hour)catchLogByHour  ${serverInfo[*]} ${logInfo[*]}

 

因为坚持了模块化的设计,所以理论上我可以在不惊动catch.sh, main.shpush.sh 增加失败重试的功能:

 

#!/bin/bashMAX_RE_CONNECT=2SLEEP_TIME=2# 实际推送动作function pushAction(){        local ip=$1        local user=$2        local password=$3        local path=$4        local localPath=$5        local error=$6        :>$error # 清空文件相当于rm,touch命令        export RSYNC_PASSWORD="$password"        rsync -Cavz $user@$ip::$path $localPath > $error 2>&1        # 判断是否发送错误        grep "rsync error" $error > $error"_copy"        cp $error"_copy" $error        rm -f $error"_copy"}# 失败重新尝试,一旦超过最大尝试次数认为无法完成function push(){        local serverInfo=($1 $2 $3) # ip username password        local logInfo=($4 $5)       # srcPath destPath        local error=$6        local i=0        while [ $i -lt $MAX_RE_CONNECT ]        do                pushAction ${serverInfo[*]} ${logInfo[*]} $error                # no error                if [ ! -s $error ]; then                        break                fi                echo "try again..."                sleep $SLEEP_TIME                i=`expr $[$i+1]`        done}# for test# serverInfo=([1]="172.18.11.201" [2]="log" [3]="wappplog")# fileInfo=([1]="logs/syslog/project_log.20131229.16" [2]="./lishujun.log" [3]="aaa")# push ${serverInfo[*]} ${fileInfo[*]}wappp@ppcn-11-212:/work/stat/read/catchlo

刚才想了一下,我觉得我近两年来虽然编码能力大增,但是写出的代码质量还是需要改善,为什么呢?当然坚持我是对的时候,多半我的设计是没有问题的,但是我在实现设计的时候会出问题,例如我会把a == b.c 写成a==b 在动态语言下这样都不会报错,所以bug混进来了,其实只要发现很好解决,但问题我自己一般都不会发现,需要测试人员或者其他人发现我去检查,发现,哦,原来是这样的啊,然后解决掉

 

我刚才想了一下,代码想要写的质量好还是应该做到这么几点,通过我这个例子:

1, 态度, 要有一个写高质量代码的心

2, 切割,合适的把代码进行切割,让每一个部分适于测试

3, 在脑子里进行单元测试,把每一种情况都执行一下

例如我的mian.sh的测试用例

1 不输入参数 - 是否在指定目录抓取到昨天的日志

2 输入前天的日期  - 是否抓到非压缩的文件

3 输入历史日期 - 是否抓到压缩的文件

4 输入当前日期 - 是否抓到今天前一个小时的所有非压缩文件

5 输出过于久远的日期以至于肯定抓不到如何文件 - 是否提示文件was not found

因为鄙人的天资所限,我实在不能把这个测试从main.sh一直跟到catch.sh和push.sh。我只能单个模块进行模拟测试,在每个模块里验证每个模块的功能,

 

 

 

 

转载于:https://www.cnblogs.com/code-style/p/3494580.html

你可能感兴趣的文章
新安装的WAMP中phpmyadmin的密码问题
查看>>
20172303 2017-2018-2 《程序设计与数据结构》第5周学习总结
查看>>
eclipse中将一个项目作为library导入另一个项目中
查看>>
Go语言学习(五)----- 数组
查看>>
Android源码学习之观察者模式应用
查看>>
416. Partition Equal Subset Sum
查看>>
Django之FBV与CBV
查看>>
Vue之项目搭建
查看>>
app内部H5测试点总结
查看>>
[TC13761]Mutalisk
查看>>
Data Wrangling文摘:Non-tidy-data
查看>>
while()
查看>>
常用限制input的方法
查看>>
IIS7下使用urlrewriter.dll配置
查看>>
并行程序设计学习心得1——并行计算机存储
查看>>
JAVA入门到精通-第86讲-半双工/全双工
查看>>
bulk
查看>>
js document.activeElement 获得焦点的元素
查看>>
C++ 迭代器运算
查看>>
【支持iOS11】UITableView左滑删除自定义 - 实现多选项并使用自定义图片
查看>>