领导交代任务,要每天检查定时任务有没有执行。虽然简单但太繁琐,写了个脚本偷懒。顺便学习几个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 |