领导交代任务,要每天检查定时任务有没有执行。虽然简单但太繁琐,写了个脚本偷懒。顺便学习几个bash知识点。温故知新吧。

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
32
33
34
35
36
37
38
39
40
#检查前一天的crontab日志有没有执行JOB1和JOB2两个定时任务
#检查数据库中的数据是否及时清理完
#!/bin/bashdeclare -i DB_STATUS=0
#由于日志日期只有月、日有效,时间不作判断,因此使用date -d参数格式化时间输出。
#由于date命令用于grep,中间带空格,无法直接拼接,必须先赋予一个变量,然后用双引号标注该变量作为grep参数
declare 
YESTERDAY=`
date 
-d last-day +
"%b %d"
`
declare 
PERHOUR_JOB=
"JOB1"
declare 
PERDAY_JOB=
"JOB2"
cat 
/var/log/cron
|
grep 
"$YESTERDAY"
|
grep 
"$PERHOUR_JOB" 
>
/dev/null 
2>&1
if 
[ $? -
eq 
1 ];
then
 
echo 
"Per hour job failed."
else
 
echo 
"Per hour job success."
fi
cat 
/var/log/cron
|
grep 
"$YESTERDAY"
|
grep 
"$PERDAY_JOB" 
>
/dev/null 
2>&1
if 
[ $? -
eq 
1 ];
then
 
echo 
"Per day job failed."
else
 
echo 
"Per day job success."
fi
#切换用户执行脚本,使用su - username -c参数,直接跟整个命令行。需要用双引号括起整个命令
 
#检查数据库内的临时表有没有内容,没有的话为正常。有的话把内容spool到chk_perday.log
su 
- oracle -c 
"sqlplus USERNAME/USERPASSWORD @/tmp/chk_perday.sql >/dev/null 2>&1"
#注意:当循环内需要对外部变量赋值,不能使用command|while read line格式
#必须先把输出保存到临时文件,然后在最后done < 文件名。
#这是因为前者while调用子进程,子进程内的赋值不带入父变量;后者在统一进程,赋值正常。
while 
read 
XM
do
 
if 
[ XM != null ];
then
  
DB_STATUS=1
  
echo 
"$XM transfer failed"
 
fi
done 
/tmp/chk_perday
.log
if 
[ $DB_STATUS = 0 ];
then
 
echo 
"Data transfer success."
else
 
echo 
"Data transfer failed."
fi
exit