📄 try
字号:
#!/bin/ksh#(@) 任务调度机制# 功能: 检查输入字段的内容是否合法 # 用法: getTaskFmt 任务号如 CM_CFG_0007# 返回 0 -- 字段合法 其他 -- 字段检查不合法function chkInputField{ dictName=$1 dictValue=$2 $HOME/hpux/etc/seek $dictName | head -1 | read -r f1 f2 fldType rest if [[ `expr "$fldType" : '.*\(不在\).*$'` = "不在" ]] then logit "WARN" "$dictName 不在数据字典中" echo "$dictName 不在数据字典中" return 1 fi echo $fldType | tr "[[:upper:]]" "[[:lower:]]" | read -r domainType case "$domainType" in int) if [[ `expr "$dictValue" : '[[:digit:]+-]*'` != ${#dictValue} ]] then logit "WARN" " $dictName 要求全部是数字,$dictValue 含有其他字符" echo "$dictName 要求全部是数字,$dictValue 含有其他字符" return 2 fi ;; char) ;; dec) if [[ `expr "$dictValue" : '[[:digit:]+-.]*'` != ${#dictValue} ]] then logit "WARN" " $dictName 要求全部是数字与小数点以及正负号组成的字符串,$dictValue 含有其他字符" echo "$dictName 要求全部是数字与小数点以及正负号组成的字符串,$dictValue 含有其他字符" return 3 fi ;; esac return 0}# 功能: 得到指定任务的配置信息# 用法: getTaskFmt 任务号如 CM_CFG_0007# 返回 0 -- 获取成功 其他 -- 失败function getTaskFmt{ # 必须输入参数, 任务号如 CM_CFG_0007 if [[ $# != 1 ]] then logit "WARN" "调用函数 getTaskFmt 时没有输入任务号,如CM_CFG_0007" return 1 fi taskSqno=$1 fmtfile=${FMTPATH}/I_${taskSqno}.fmt # 如果文件不存在,则退出 if [[ ! -s $fmtfile ]] then logit "WARN" "输入文件格式定义文件 $fmtfile 不存在或无内容" return 2 fi # label 0 -- 输入格式文件中无字典项 1 -- 输入格式文件中有字典项 label=0 # 从输入文件格式定义文件中得到数据字典项 while read -r f1 f2 rest do # 不处理注释行 if [[ `expr "$f1" : '\(.\).*$'` = "#" ]] then continue fi # 如果字段长度为 0 ,则不处理 if [[ ${#f1} = 0 ]] then continue fi # 字典项的必须为 [a-zA-Z0-9_.] 格式 ,大小写字母,0-9数字,下划线, . if [[ `expr "$f1" : '[a-zA-Z0-9_.]*'` = ${#f1} ]] then label=1 if [[ $f1 = mesg || $f1 = mesgId ]] then continue fi echo "$f1 \c" elif [[ `expr "$f2" : '[a-zA-Z0-9_.]*'` = ${#f2} ]] then label=1 if [[ $f2 = mesg || $f2 = mesgId ]] then continue fi echo "$f2 \c" fi done < $fmtfile # 如果输入格式文件中有字典项,则 if [[ $label = 1 ]] then echo "" return 0 else logit "WARN" "输入文件格式定义文件 $fmtfile 无任何字典项,需检查该文件" return 1 fi return 0}# 功能: 下载指定类型任务最新的输入文件# 用法: getOmsFile 任务号如 CM_CFG_0007# 返回 0 -- 存在最新的输入文件,并且下载成功 1 -- 没有符合条件的文件 2 -- 文件存在但是下载不成功function getOmsFile{ 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 tmpfile=$TMPPATH/ftp.tmp tmpfile1=$TMPPATH/ftp.tmp1 tmpfile2=$TMPPATH/ftp.tmp2 # 判断有无当前最新的指定任务对应的输入文件 # 从 OMS 服务器,取出当前的 压缩文件 ftp -i -n $OMSIP <<! > $tmpfile 2>/dev/null user $OMSUSER $OMSPSWD bin cd $OMSCFGPATH ls -lrt I_${ftpfile}*.gz bye! # 将符合条件的文件生成临时文件1 grep -e "I_${ftpfile}*.gz" $tmpfile > $tmpfile1 rm -f $tmpfile # 如果没有符合条件的文件,则退出 if [[ ! -s $tmpfile1 ]] then rm -f $tmpfile1 2>/dev/null return 1 fi # 删除临时文件1 rm -f $tmpfile1 2>/dev/null # 对其进行排序,最新的在最后一个 awk ' { print $NF; } ' | sort > $tmpfile2 tail -1 $tmpfile2 | read -r inputFile # label 成功标识 1 -- 不成功 0 -- 成功 label=1 loop=1 # 进行文件下载,直到到了一定次数或下载成功 while (( loop < RETRYTIMES )) do ftp -i -n $OMSIP <<! > /dev/null 2>/dev/null user $OMSUSER $OMSPSWD lcd $INPATH cd $OMSCFGPATH bin get $inputFile bye! (( loop = loop + 1 )) if [[ $? = 0 ]] then label=0 break else # 睡眠一段时间 sleep $sleepperiod continue fi done # 如果下载文件不成功,则退出 if [[ $label = 1 ]] then # 返回 2 -- 文件存在但是下载不成功 return 2 else if [[ -s $INPATH/$inputFile ]] then /usr/contrib/bin/gunzip $INPATH/$inputFile echo "${inputFile%.gz}" fi fi # 清理旧的文件,将其改名,改成格式如 I_CM_CFG_0007_${TMSTAMP}.txt.gz.old # 保证处理过的文件不再重新处理 for i in `cat $tmpfile2` do ftp -i -n $OMSIP <<! > /dev/null 2>/dev/null user $OMSUSER $OMSPSWD cd $OMSCFGPATH bin rename $i ${i}.old bye! done rm -f $tmpfile2 2>/dev/null return 0}# 功能: 将 从 OMS 服务器下载的文件转换成 各个实例可以使用的配置文件# 用法: translateFile 任务号 转换文件名称# 返回: 0 -- 转换成功 其他 -- 转换不成功function translateFile{ if [[ $# != 2 ]] then logit "WARN" "输入参数个数不够,用法 translateFile 任务号 转换文件名称" headline "000801" "输入参数个数不够,用法 translateFile 任务号 转换文件名称" return 1 fi fileType=$1 currFile=$2 fmtFile=${fileType}.fmt # 根据不同情况,进行文件转换,先转换成临时的配置文件,根据实际情况生成正式的配置文件 case "$fileType" in *) targetFile=${TMPPATH}/${fileType}.cfg cfgNormalFile=${CFGPATH}/${fileType}.cfg cfgFile=${CFGPATH}/${fileType}.cfg1 rm -f $cfgFile 2>/dev/null touch $cfgFile ;; esac # 判断文件是否存在 if [[ ! -s ${INPATH}/${currFile} ]] then logit "WARN" "输入文件 ${INPATH}/${currFile} 不存在" headline "000801" "输入文件 ${INPATH}/${currFile} 不存在" return 2 fi OLDIFS=$IFS # 判断输入文件的成功标志 # 返回标识 retFlag # 0 -- 成功 1 -- 失败 2 -- 警告信息 read -r line < $currFile echo $line | tr -d " " | tr "|" " " | read -r f1 f2 f3 f4 f5 retFlag retCode retMesg rest if [[ $retCode != 000000 ]] then logit "WARN" "输入文件 返回标识 不为 000000,内容错误" headline "000802" "输入文件 返回标识 不为 000000,内容错误" return 3 fi # 将输入格式文件中的数据字典单词列表放在临时配置文件,作为第一行内容。 getTaskFmt $fileType > $targetFile if [[ $? != 0 ]] then logit "WARN" "调用 getTaskFmt 返回错误,获取输入文件格式不成功" headline "000803" "输入文件返回标识 不为 000000,内容错误" return 4 fi # 转换成临时的配置文件,没有进行合法性检查 awk -v taskNo=$fileType ' BEGIN { FS="|"; OFS=" " } # 不处理标题行,从第二行开始转换 NR > 1 { if ( taskNo != "WK_LOG_1013" && taskNo != "WK_LOG_1015" && taskNo != "WK_LOG_1016" && taskNo != "WK_LOG_1017" ){ start=1 } else { start=3 } # 如果字段的内容全为空格或为空,则置为 NA for ( i = start; i < NF+1; i++ ){ if ( length ( $i ) == 0 ){ $i = "NA" } printf "%s ", $i; } printf "\n"; } ' $currFile >> $targetFile # 任务号 taskId=$fileType # 文件名称 fileName=$currFile # 对转换成的临时配置文件进行合法性检查 (( recNo = 1 )) while read -r line do # 第一行为数据字典单词行 if (( recNo == 1 )) ; then set -A wordList $line # 其他行为明细行 else set -A valueList $line fi # 输入文件中的行号,如第 1000 行 fileLineNo=$recNo # 检查输入的字段个数是否符合格式文件汇总的字段个数要求 if [[ ${#wordList[*]} != ${#valueList[*]} ]] then logit "WARN" "文件 $currFile 中第 $recNo 行中,字段个数不符合格式文件汇总的字段个数要求" errMsg="文件 $currFile 中第 $recNo 行中,字段个数不符合格式文件汇总的字段个数要求" infoline "010701" "明细行内容错误" "$taskId" "$fileName" "$fileLineNo" "$errMsg" continue fi # 取正式配置文件字段个数 cout=${#wordList[*]} (( i = 0 )) (( errCout = 0 )) while (( i < cout )) do errMsg="" chkInputField "${wordList[${i}]}" "${valueList[${i}]}" | read -r errMsg if [[ ${#errMsg} > 0 ]] then logit "WARN" "文件 $currFile 中第 $recNo 行中,$errMsg" fileLineNo=$recNo infoline "010702" "明细行内容错误" "$taskId" "$fileName" "$fileLineNo" "$errMsg" (( errCout = errCout + 1 )) continue fi if [[ ${valueList[${i}]} = "NA" ]] then valueList[${i}]="${wordList[${i}]}-${valueList[${i}]}" fi done # 如果检查后,完全没有错误,则将输入行内容写入正式的配置文件 if (( $errCout == 0 )) ; then echo $line >> $cfgFile fi # 累加文件记录行数 (( recNo = recNo + 1 )) done < $targetFile # 替换正式的文件 mv $cfgFile $cfgNormalFile return 0} . /home/oms/hpux/.setenv . /home/oms/hpux/src/COMMON/common.ksh chkInputField procRespawnFlag char getTaskFmt CM_CFG_0007 getOmsFile CM_CFG_0007
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -