📄 common.ksh
字号:
fi}# 将进程的 ELAPSED Time 转化为分钟# 用法: elapsed_time [[ dd-]hh:]mm:ssfunction elapsed_time{ if [[ ${#1} = 0 ]] then return 1 fi etime=$1 echo etime is $etime if [[ `expr "$etime" : '^.*-' 2>/dev/null` > 0 ]] then dd=`expr "$etime" : '^\(.*\)-.*$' 2>/dev/null` hh=`expr "$etime" : '^.*-\(..\).*$' 2>/dev/null` mm=`expr "$etime" : '^.*\(..\):.*$' 2>/dev/null` ss=`expr "$etime" : '^.*\(..\)$' 2>/dev/null` echo dd is $dd echo hh is $hh echo mm is $mm echo ss is $ss elif [[ `expr "$etime" : '^.*:.*:.*$' 2>/dev/null` > 0 ]] then dd=0 hh=`expr "$etime" : '^\(..\).*$' 2>/dev/null` mm=`expr "$etime" : '^.*:\(..\):..$' 2>/dev/null` ss=`expr "$etime" : '^.*\(..\)$' 2>/dev/null` echo dd is $dd echo hh is $hh echo mm is $mm echo ss is $ss else dd=00 hh=00 mm=`expr "$etime" : '^\(..\):.*$' 2>/dev/null` ss=`expr "$etime" : '^.*\(..\)$' 2>/dev/null` echo dd is $dd echo hh is $hh echo mm is $mm echo ss is $ss fi min=`echo "$dd * 60 * 24 + $hh * 60 + $mm" | bc` echo $min}# 日志登记函数# 日志级别 DEBUG -- 调试信息 INFO -- 一般运行信息 WARN -- 警告类信息 ERROR -- 运行错误 FATAL -- 系统崩溃function logit{ mark=$FUN_MARK level=$1 mesg=$2 TM=`date +'%Y%m%d %H:%M:%S'` echo "[$TM] [$mark] [$level] [$mesg]" echo "[$TM] [$mark] [$level] [$mesg]" >> $LOGFILE}# 文件传输函数# 用法: fput 文件名称 (文件名称中没有路径信息),默认传输 $OUTPATH 下的文件function fput{ sleepperiod=$FTPRESTTIME # 默认间隔时间为 60 秒 if [[ ${#sleepperiod} = 0 || ${sleepperiod} = 0 ]] then sleepperiod=60 fi loop=0 if [[ ${#1} = 0 ]] then logit WARN "文件名称不能为空" return 1 fi ftpfile=`basename $1` # 默认上传 5 次 if [[ ${#RETRYTIMES} = 0 || ${RETRYTIMES} = 0 ]] then RETRYTIMES=5 fi # 进行文件上传,直到到了一定次数或上传成功 while (( loop < RETRYTIMES )) do ftp -i -n $OMSIP <<! > /dev/null 2>/dev/null user $OMSUSER $OMSPSWD lcd $OUTPATH cd $OMSPATH bin put ${ftpfile} bye! (( loop = loop + 1 )) if [[ $? = 0 ]] then break else # 睡眠一段时间 sleep $sleepperiod continue fi done}# 接口文件标题行生成函数# 1) # 标题行组成规则# 服务器号(Server ID),实例号(Instance ID),任务号(Worker ID),时间戳,交易流水号,成功标志,# 错误码,错误信息# 2)# 各个字段解释# 服务器号 为4位字符。# 实例号 2位字符# 任务号 为6位字符,格式是实例号(2位)+ 功能号(4位),节点号与功能号均可为数字与字母# 时间戳,精确到秒,为14位数字# 交易流水号, 任务号+时间戳 为 18 位字符,# 成功标志。 0 -- 成功 1 -- 失败 2 -- 警告信息# 错误码 0000 -- 本次采集成功, 其他 -- 本次采集失败# 错误信息,错误的详细描述信息,主要是 AGENT 程序运行过程中自身的错误。如校数据校验不合法。# # 错误码与错误信息为 AGENT 使用,主要区分采集任务是否正常结束。如果出现系统异常,则登记异常信息。# 在 OMS 做数据导入的时候,不进行数据的导入。但是可以登记采集任务本身的成功失败情况(交易日志)。# 用法: headline 返回码 返回信息function headline{ retcode=$1 retmesg=$2 servid=$OMS_SERVER_ID instid=$OMS_INSTANCE_ID taskid=$FUN_MARK # echo OMS_SERVER_ID is $OMS_SERVER_ID OMS_INSTANCE_ID is $OMS_INSTANCE_ID # 时间戳,用来构造 结果文件名称 timestr=`date +'%Y%m%d%H%M%S'` tran_sqno=${taskid}${timestr} # 如果返回码以 00 结尾,则认为是执行正确,否则认为错误 if [[ `expr "$retcode" : '^.*\(..\)$'` = "00" ]] then retflag=0 else retflag=1 fi # 构造输出标题串 headstr="${servid}${FLDSEP}${instid}${FLDSEP}${VERSION}${FLDSEP}${taskid}${FLDSEP}${timestr}${FLDSEP}${tran_sqno}${FLDSEP}${retflag}${FLDSEP}${retcode}${FLDSEP}${retmesg}${FLDSEP}" # 如果没有生成输出文件,构造输出文件名称 if [[ `expr "$FUN_REPORT_FILE" : '.*tmp$'` = 0 ]] then # 构造输出文件名称 FUN_REPORT_FILE=${FUN_REPORT_FILE}_${timestr}.tmp outfile=${OUTPATH}/${FUN_REPORT_FILE} echo "${servid}${FLDSEP}${instid}${FLDSEP}${VERSION}${FLDSEP}${taskid}${FLDSEP}${timestr}${FLDSEP}${tran_sqno}${FLDSEP}${retflag}${FLDSEP}${retcode}${FLDSEP}${retmesg}${FLDSEP}" > $outfile else outfile=${OUTPATH}/${FUN_REPORT_FILE} ex $outfile <<EOF >/dev/null 2>&1 1 s~^.*$~${servid}${FLDSEP}${instid}${FLDSEP}${VERSION}${FLDSEP}${taskid}${FLDSEP}${timestr}${FLDSEP}${tran_sqno}${FLDSEP}${retflag}${FLDSEP}${retcode}${FLDSEP}${retmesg}${FLDSEP}~gxEOF fi # echo "outfile is as below" # cat $outfile # 构造输出文件# cat <<! > $outfile# ${servid}${FLDSEP}${instid}${FLDSEP}${taskid}${FLDSEP}${timestr}${FLDSEP}${tran_sqno}${FLDSEP}${retflag}${FLDSEP}${retcode}${FLDSEP}${retmesg}${FLDSEP}#! }# 明细行写入结果文件function infoline{ if [[ $# = 0 ]] then return 0 fi # 输出结果文件,在构造标题行时,文件名称已经生成. outfile=${OUTPATH}/${FUN_REPORT_FILE} while [[ $# != 0 ]] do echo "${1}${FLDSEP}\c" >> $outfile shift done printf "\n" >> $outfile return 0}# 将本任务的结果文件上传到OMS服务器,任务的结果文件${FUN_REPORT_FILE},定义在 fun.cfg 中# 用法: fputheadfunction fputhead{ # 切换到文件上传路径 cd $OUTPATH cat ${FUN_REPORT_FILE} mv ${FUN_REPORT_FILE} ${FUN_REPORT_FILE%.tmp}.txt FUN_REPORT_FILE=${FUN_REPORT_FILE%.tmp}.txt gzip ${FUN_REPORT_FILE} fput ${FUN_REPORT_FILE}.gz if [[ $? = 0 ]] then rm -f ${FUN_REPORT_FILE}.gz fi}# 将本任务的结果文件上传到OMS服务器,任务的结果文件${FUN_REPORT_FILE},定义在 fun.cfg 中# 用法: fputrptfunction fputrpt{ # 切换到文件上传路径 cd $OUTPATH cat ${FUN_REPORT_FILE} mv ${FUN_REPORT_FILE} ${FUN_REPORT_FILE%.tmp}.txt FUN_REPORT_FILE=${FUN_REPORT_FILE%.tmp}.txt gzip ${FUN_REPORT_FILE} fput ${FUN_REPORT_FILE}.gz if [[ $? = 0 ]] then rm -f ${FUN_REPORT_FILE}.gz fi}function raisetime{ # 输入参数为两个 if [[ ${#} != 2 ]] then echo "用法 raisetime 原始时间[HHMM] 增量[Minutes]" return 1 fi Time=$1 increment=$2 if [[ ${#Time} = 4 ]] then hour=`expr substr $Time 1 2` min=`expr substr $Time 3 2` fi if [[ `expr $Time : '.*:'` > 0 ]] then hour=`expr $Time : '\(.*\):.*$` min=`expr $Time : '.*:\(.*\)$'` fi# echo "hour is $hour min is $min incr is $increment" echo "scale=0 ;( $min + $increment ) % 60 " | bc | read -r reachMin echo "scale=0 ;( $min + $increment ) / 60 " | bc | read -r addHour echo "scale=0 ;( $hour + $addHour ) % 24 " | bc | read -r reachHour echo "scale=0 ;( $hour + $addHour ) / 24 " | bc | read -r addDay printf "%02s %02s %s\n" ${reachHour} ${reachMin} $addDay return 0}function formate_month{ case $1 in "Jan") month="01" ;; "Feb") month="02" ;; "Mar") month="03" ;; "Apr") month="04" ;; "May") month="05" ;; "Jun") month="06" ;; "Jul") month="07" ;; "Aug") month="08" ;; "Sep") month="09" ;; "Oct") month="10" ;; "Nov") month="11" ;; "Dec") month="12" ;; esac return 0}function formate_weekday{ case $1 in "Mon") weekday="01" ;; "Tue") weekday="02" ;; "Wed") weekday="03" ;; "Thu") weekday="04" ;; "Fri") weekday="05" ;; "Sat") weekday="06" ;; "Sun") weekday="07" ;; esac return 0}# 判断任务是否到启动时刻 # 用法: isReachTime 起始时间 [HHMM|HH:MM] 间隔 [[MM]] 周期标识 # 返回 0 -- 到启动时间 1 -- 没有到启动时间 其他 -- 检查错误function isReachTime{ # 检查输入的合法性 if [[ $# != 3 ]] then # 字段个数不够 echo "isReachTime 起始时间 [HHMM|HH:MM] 间隔 [[MM]] 周期标识" return 2 fi if [[ `expr "$1" : '.*:' ` > 0 ]] then if (( ${#1} != 5 )) ; then echo "输入起始时间格式错误,格式为 [HHMM|HH:MM]" return 3 fi else if (( ${#1} != 4 )) ; then echo "输入起始时间格式错误,格式为 [HHMM|HH:MM]" return 4 fi fi startTime=$1 periodTime=$2 periodFlag=$3 # 取当前的时间 HHMM currTime=`date +'%H%M'` echo $startTime | tr -d ':' | read -r firstTime# echo "firstTime is $firstTime" # 将起始时间转化为自 00:00 之后的分钟数。 firHour=`expr $firstTime : '\(.*\)..$'` firMin=`expr $firstTime : '.*\(..\)$'` currHour=`expr $currTime : '\(.*\)..$'` currMin=`expr $currTime : '.*\(..\)$'` # echo "firHour is $firHour firMin is $firMin currMin is $currMin currHour is $currHour" startMinutes=`echo " $firHour * 60 + $firMin" | bc`# echo "起始分钟数 $startMinutes" currMinutes=`echo "$currHour * 60 + $currMin" | bc`# echo "当前分钟数 $currMinutes"# 运行周期标志 periodFlag char 1# 0 - 每天多次 1 - 每天一次 2 - 周末 3 - 月末 4 - 年末 5 - 季末 6 - 半年末# 根据运行周期标志 periodFlag 判断是否到了启动时刻 # 计算当前时间和起始时间的间隔的分钟数,然后判断时间间隔正好是运行周期的整数倍
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -