Uinx AIX系统下一shell脚本的测试

上一篇 / 下一篇  2011-11-09 18:25:35 / 个人分类:Shell

#进程日志50-30-02-00-00-013

#该信息点记录计费系统所有进程的告警日志和关键事件信息,主要用于进程运行监控,为及早发现系统进程运行的异常情况

#信息点要求按高频传送

 

if [ `ps -afe|grep bossnm_session_log.csh|grep -v grep|wc -l` -gt 1 ]

then

       echo `date "+%Y-%m-%d %H:%M:%S"`" 进程日志信息点处理进程已经启动!"

       return

fi

 

if [ `hostname` = "ocs_jf_1" ]; then

       WORK_BASE=/ocsjfdata11;export WORK_BASE

       HOST_IP="134.96.93.135"

       export ORACLE_HOME=/app/oracle

elif [ `hostname` = "ocs_jf_2" ]; then

       WORK_BASE=/ocsjfdata21;export WORK_BASE

       HOST_IP="134.96.93.136"

       export ORACLE_HOME=/app/oracle

elif [ `hostname` = "rhjfp01" ]; then

       WORK_BASE=/rhjfdata11;export WORK_BASE

       HOST_IP="134.96.93.150"

       export ORACLE_HOME=/app/oracle/product/10.2.0/db_1

elif [ `hostname` = "rhjfp02" ]; then

       WORK_BASE=/rhjfdata21;export WORK_BASE

       HOST_IP="134.96.93.151"

       export ORACLE_HOME=/app/oracle/product/10.2.0/db_1

elif [ `hostname` = "ocspstdb2" ]; then

       WORK_BASE=/rhjf/mojf;export WORK_BASE

       HOST_IP="134.96.93.216"

       export ORACLE_HOME=/app/oracle/product/10g

fi

 

export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK

export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH

export PATH=$PATH:$ORACLE_HOME/bin:$HOME/bin

 

 

ORA_STR=info_28/info_28@pstdb1

WORK_TIME_FILE=$WORK_BASE/data/uploader/bossnm/normal/sessionLog.time

LOG_FILE=$WORK_BASE/data/uploader/bossnm/normal/50-30-02-00-00-013.log

OriPath=`pwd`

 

#计算前一天日期,如果当日日志中没有找到启、停日志,则在昨天日志中再找下

get_yesterday()

{

echo `sqlplus -s ${ORA_STR} <<END

                       set pagesize 0 feedback off verify off heading off echo off

                       SELECT to_char(SYSDATE,'yyyymmdd') FROM dual;

                       exit;

END`

}

 

#计算最后一次状态变更时间

get_last_date()

# $LOGDATE,$LOG_FILE,$KEY(启动或停止),$VER(0:taskframe. 1:ecframe)

{

 

 

       V_LOGDATE=$1                   #检查日期

       V_LOG_FILE=$2                  #检查原始日志文件名

       V_KEY=$3                                       #启动或停止关键字

       V_VER=$4                                       #0:taskframe. 1:ecframe

       

       #taskframe的日志文件的日期是yymmdd(年份只有2),所以需要对系统时间进行转换

       V_LOGDATE=`echo $V_LOGDATE|awk '{print substr($0,3,6)}'`

       

       #重组当日日志文件名

       V_LOG_FILE=$V_LOG_FILE$V_LOGDATE"*"

 

                                       #检查文件是否存在,如果存在则检查是否有启动日志

                       if [ `ls -1 $V_LOG_FILE|wc -l` -gt 0 ];then

                               if [ $V_VER -gt 0 ]; then

                                       V_LAST_DATE=`cat "$V_LOG_FILE"|grep "$V_KEY"|awk '{print substr($0,1,4)substr($0,6,2)substr($0,9,2)substr($0,12,2)substr($0,15,2)substr($0,18,2)}'|tail -1`

                               else

                                       V_LAST_DATE=`cat "$V_LOG_FILE"|grep "$V_KEY"|awk -F" " '{print $2}'|awk -F"." '{print $1}'|awk -F":" '{print $1$2$3}'|tail -1`

                                       if [ ! -z "$V_LAST_DATE" ];then

                                               V_LAST_DATE="20"$V_LOGDATE$V_LAST_DATE

                                       fi

                               fi

                       fi

echo $V_LAST_DATE

}

 

cd $WORK_BASE/data/uploader/bossnm/normal/work/

#15分钟运行一次

       pdate=`date +%Y%m%d`

 

       #取得上次运行的时间

       if [ -e $WORK_TIME_FILE ]; then

               LastRunTime=`cat $WORK_TIME_FILE`

       else   #如果没有保存上次的时间,则默认取当日0

               LastRunTime=`sqlplus -s $ORA_STR <<END

                       set pagesize 0 feedback off verify off heading off echo off

                       SELECT to_char(trunc(SYSDATE),'yyyymmddhh24miss') FROM dual;

                       exit;

END`

       fi

       nowRunTime=`sqlplus -s $ORA_STR <<END

       set pagesize 0 feedback off verify off heading off echo off

       SELECT to_char(SYSDATE,'yyyymmddhh24miss') FROM dual;

       exit;

END`

       echo 'Last='$LastRunTime'  now='$nowRunTime

 

 

       pdate=`expr substr $nowRunTime 1 8`

       #根据系统时间计算文件序号。

       iSerialNo=`sqlplus -s $ORA_STR <<END

               set pagesize 0 feedback off verify off heading off echo off

               select lpad(substr(datt, 9, 2)*4+ceil((substr(datt, 11, 2)*60+substr(datt, 13, 2))/(15*60)),8,'0') from (select TO_CHAR(SYSDATE, 'YYYYMMDDHH24MISS') as datt from dual)

               exit;

END`

 

       #如果序号=00000000需要调整为00000001

       if [ "$iSerialNo" -eq "00000000" ];then

               iSerialNo="00000001"

       fi

 

       #带序号的文件名称

       sFileName="BOSSNM.50-30-02-00-00-013.3002.$pdate.$iSerialNo.0.5710"

 

 

       #先删除临时文件

       if [ -f "_temp_50-30-02-xx-00-013" ];then

               rm _temp_50-30-02-xx-00-013

       fi

       LOGDATE=`date +%Y%m%d`

 

sqlite3 BOSSNM 'select ps_id ||"|"||trim(ps_name)||"|"||trim(ps_key_name)||"|"||trim(ps_host_user)||"|"||ps_status||"|"||strftime("%Y%m%d%H%M%S",ps_status_time)||"|"||trim(ps_prg_name)||"|"||trim(log_file)||"|"||trim(stop_key)||"|"||trim(start_key)||"|"from bu_session_log where is_check=1 AND trim(ps_host_ip) = '${HOST_IP}' order by ps_id' >tmp.session.log.cfg

 

       #读取监控列表文件

       while read CFG_LINE

       do

       #跳过空行

       if [ "$CFG_LINE" = "" ];then

               continue;

       fi

                               PS_ID=`echo $CFG_LINE|awk -F'|' '{print $1}'`

       PS_NAME=`echo $CFG_LINE|awk -F'|' '{print $2}'`

       PS_KEY_NAME=`echo $CFG_LINE|awk -F'|' '{print $3}'`

       PS_HOST_USER=`echo $CFG_LINE|awk -F'|' '{print $4}'`

       PS_STATUS=`echo $CFG_LINE|awk -F'|' '{print $5}'`

       PS_STATUS_TIME=`echo $CFG_LINE|awk -F'|' '{print $6}'`

       PS_PRG_NAME=`echo $CFG_LINE|awk -F'|' '{print $7}'`

       LOG_FILE=`echo $CFG_LINE|awk -F'|' '{print $8}'`

       STOP_KEY=`echo $CFG_LINE|awk -F'|' '{print $9}'`

       START_KEY=`echo $CFG_LINE|awk -F'|' '{print $10}'`

       

       echo $PS_STATUS

       #进程检查

       NUM=`ps -ef|grep "$PS_HOST_USER"|grep "$PS_PRG_NAME"|grep "$PS_KEY_NAME"|grep -v grep|wc -l`

       echo 'ps -ef结果'$PS_HOST_USER"-"$PS_PRG_NAME"("$PS_KEY_NAME"):"$NUM

       

#进程最新启动

       if [ "$NUM" != "0" -a "$PS_STATUS" = "0" ];then

               #查进程日志,找到最近的启动时间

         V_LAST_DATE=`get_last_date "$LOGDATE" "$LOG_FILE" "$START_KEY"`

                  if [ -z "$V_LAST_DATE" ];then

                       LOGDATE=`get_yesterday`

                                                       V_LAST_DATE=`get_last_date "$LOGDATE" "$LOG_FILE" "$START_KEY"`

         fi

             echo '$PS_KEY_NAME='$PS_KEY_NAME',$LOGDATE='$LOGDATE

 #如果两天都找不到启、停时间,就设置为系统当前时间

                    echo V_LAST_DATE=$V_LAST_DATE

                    if [ -z "$V_LAST_DATE" ];then

                   V_LAST_DATE=`date +%Y%m%d%H%M%S`

          fi

 

#日志中提取的日期比表中保存的日期晚,就以日志文件的时间、状态更新表,并生成上发数据

              if [ "$V_LAST_DATE" -gt "$PS_STATUS_TIME" ];then

                      

  echo "0|3|||启动$PS_NAME进程||$V_LAST_DATE" >>./_temp_50-30-02-xx-00-013

                                       fi

                               fi

 

#进程最新停止

       if [ "$NUM" = "0" -a "$PS_STATUS" = "1" ];then

               #查进程日志,找到最近的停止时间

           V_LAST_DATE=`get_last_date "$LOGDATE" "$LOG_FILE" "$STOP_KEY"`

                                       echo '$V_LAST_DATE'=$V_LAST_DATE >>$LOG_FILE

                 if [ -z "$V_LAST_DATE" ];then

                  LOGDATE=`get_yesterday`

        V_LAST_DATE=`get_last_date "$LOGDATE" "$LOG_FILE" "$STOP_KEY"`

                                 fi

                                 #如果两天都找不到启、停时间,就设置为系统当前时间

                      if [ -z "$V_LAST_DATE" ];then

                      V_LAST_DATE=`date +%Y%m%d%H%M%S`

                                 fi

 #日志中提取的日期比表中保存的日期晚,就以日志文件的时间、状态更新表,并生成上发数据

                 if [ "$V_LAST_DATE" -gt "$PS_STATUS_TIME" ];then

echo '$V_LAST_DATE='$V_LAST_DATE',$PS_STATUS_TIME='$PS_STATUS_TIME'需要更新'>>$LOG_FILE

sqlite3 BOSSNM 'update bu_session_log set ps_status=0,ps_status_time="'$V_LAST_DATE'" where ps_host_ip="'$PS_HOST_IP'" and ps_key_name="'$PS_KEY_NAME'"'

 

 

'

echo "0|3|||停止$PS_NAME进程||$V_LAST_DATE" >>./_temp_50-30-02-xx-00-013

                                       fi

                               fi

       done<tmp.session.log.cfg

 

       #如果没有启停日志,则先生成空文件

       if [ ! -e "_temp_50-30-02-xx-00-013" ];then

               touch ./_temp_50-30-02-xx-00-013

     &nb

TAG:

 

评分:0

我来说两句