⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 try

📁 ksh 实现的基于hpux下的性能数据以及故障的采集程序。可以作为新手练手使用
💻
字号:
#!/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 + -