Datastage 的任務監控程式--定時以及任務報錯

myamor發表於2012-04-01
#!bin/sh
. $HOME/.profile
curpath=$(cd "$(dirname "$0")"; pwd)
cd $curpath
export LANG=C
tmpfile=jobinfo.log
lproject=ETL_NEW             #datastage的project
printMsg=""
cweek=`date +%w` 
cday=`date +%e`
#gday=`expr substr $cday, 1 2`   #單個數字的天時Grep的時候加一個, 比較有意思
Pday=`date +%Y%b%d`   #2010mar22
today=`date +%Y%m%d`  #20100322
  
logfile=d${today}.log
printMsg="${today} Job: "
fatalNum=0
filelog=$curpath/dssh.log
 
sendMessage ()
{
  #簡訊告警----根據自己情況還定
}

#獲取相關JOB的檔案目錄
getJobCategory ()

Jobname=$1
cd /home/dsadm
dssh<$filelog
LOGTO ETL_NEW
select * from DS_JOBS WHERE NAME ='$Jobname';
qUIT
!
catname=`grep "Category" $filelog|awk '{print $2}'` 
echo $catname
}

#Program Begin

crontab -l|grep "ETL_NEW"|awk '{print $2$1,$3,$4,$5,$9}' >cron.lst  #生成任務列表
sed -e 's/1,2,3,4,5,6,0/*/g' cron.lst >cron.out
sed -e 's/1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31/*/g' cron.out >cron.lst

###增加沒有加入定時的JOB監控
cat cron_hand.lst >>cron.lst
####改善建議,可以增加在1號的時候將上個月的LOG檔案壓縮一下。 後期實現
while true
   do
    ctime=`date +%H%M`  
    rm cron.bak
   
    if [ "$ctime" -gt 2200 ]   #程式退出
      then
       break;
    fi
   
  while read line
   do
     if [ "$line" = "" ]
        then
          break;
     fi
   
   #line裡面有特殊字元*,在使用的時候需要用雙引號引住,否則報錯
    
   dtime=`echo "$line"|awk '{print $1}'`  #獲取定時時間
   dday=`echo "$line"|awk '{print $2}'`   #獲取定時日期
   dweek=`echo "$line"|awk '{print $4}'`   #獲取定時星期
     
    #echo "cccc:$dtime,${dweek},$cweek,$cday,$gday,$dday"
   
   #####判斷當前日期是否在定時日期列表中
   flag=-1
   if [ "$dday" != "*" ] 
    then
     flag=`echo ${dday}|awk -F"," '{ for (i=1;i<=NF;i++) { if ( $i==dd ) {print "100";break }}}' "dd=$cday"`
   fi   
   
     
   ##判斷應該當天執行的程式
   if ([ "$dweek" = "*" ] || [ `echo ${dweek}|grep -q $cweek && echo 0||echo 1` -eq 0  ]) && #--比較星期幾
      ([ "$dday" = "*" ] || [ "$dday" = "$cday" ] || [  "$flag" -eq 100 ])  #--比較天
     then
      if [ "$ctime" -gt "$dtime" ] ##時間已過定時
        then
         jobname=`echo "$line"|awk '{print $5}'`  #獲取任務名
               
         #echo $lproject,$jobname,$logfile,$Cday,$today
         
        dsjob -jobinfo $lproject $jobname>$tmpfile
   
       jobstatus=""
        jobstatus=`cat $tmpfile|grep "FAILED"`
        jobpid=`cat $tmpfile|grep "Process"|awk -F ":" '{print $2}'`
        logdate=`cat $tmpfile|grep "Job Start"|awk '{print $9$6substr(0$7,length(0$7) -1,length(0$7))}`
     
        if  [ "$Pday" != "$logdate" ]||[ "$jobstatus" != "" ]  #日期不同或者錯誤
          then
          
           jobcate=`getJobCategory ${jobname}`;
           
            printMsg="${printMsg}${jobcate}.${jobname};"
            
            fatalNum=`expr $fatalNum + 1`
            if [ "$fatalNum" -ge 5 ] && [ "$ctime" -gt 800 ]
              then
               printMsg="${printMsg} 出現錯誤,請及時處理."
               #Send Message to Mobile
               sendMessage "${printMsg}"
               printMsg="${today} Job: "
               fatalNum=0
            fi
            continue; 
         else
           if [ "$jobpid" -eq 0 ] #程式執行已經結束的
            then
               continue;
           fi
        fi 
      fi 
      echo "$line">>cron.bak    #正在執行的以及定時還未到的任務重新監控
     fi     
  done   
     if [ "$fatalNum" -gt 0 ] && [ "$ctime" -gt 800 ]
       then
          printMsg="${printMsg} 出現錯誤,請及時處理."
       #Send Message to Mobile
     sendMessage "${printMsg}"
     printMsg="${today} Job: "
       fatalNum=0
   fi
  
    mv cron.bak cron.lst
    sleep 300
  done
#Program END
 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/177006/viewspace-720201/,如需轉載,請註明出處,否則將追究法律責任。

相關文章