Datastage 的任務監控程式--定時以及任務報錯
#!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
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
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 定時任務
- Laravel 定時任務以及 cronrab 安裝Laravel
- Laravel 定時任務以及 crontab 安裝Laravel
- SpringBoot與非同步任務、定時任務、郵件任務Spring Boot非同步
- SpringTask定時任務Spring
- Oracle定時任務Oracle
- Navicat定時任務
- schedule 定時任務
- 定時任務scheduler
- 定時任務操作
- @Scheduled 定時任務
- Linux 定時任務Linux
- Linux | 定時任務Linux
- Java 定時任務Java
- At 、Crontabl定時任務
- crontab定時任務
- laravel定時任務Laravel
- SpringBoot定時任務Spring Boot
- springboot:定時任務Spring Boot
- 定時任務管理
- ubuntu定時任務Ubuntu
- 如何使用Choerodon LDAP以及配置定時任務LDA
- 定時任務crond服務
- DevOps 自動化實踐 - 定時任務監控的進化之路dev
- Linux系統中延時任務及定時任務Linux
- Linux 執行定時任務後,Laravel 專案報錯LinuxLaravel
- laravel框架任務排程(定時執行任務)Laravel框架
- SpringBoot 定時任務ScheduledSpring Boot
- java web定時任務JavaWeb
- springboot(九):定時任務Spring Boot
- SpingBoot @Scheduled定時任務boot
- 定時任務技術
- Golang——Cron 定時任務Golang
- springboot定時任務之旅Spring Boot
- Spring - Task定時任務Spring
- 定時任務總覽
- 石英定時任務-quartzquartz
- Java & Go 定時任務JavaGo
- Linux crontab 定時任務Linux