免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2568 | 回复: 7
打印 上一主题 下一主题

奇怪了,为啥cron里面执行的结果和手动执行的不一样 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-07-13 10:17 |只看该作者 |倒序浏览
一个脚本,用于检查日志里面是否有报错的
#!/bin/bash
HOMEDIR=/home/oracle
WORKDIR=$HOMEDIR/archive_check
FILE_CHECK=/u01/app/oracle/diag/rdbms/sfg/SFG/trace/alert_SFG.log
FILELN_CHECKED=$WORKDIR/checked_line
LINE_CHECKED=`cat $FILELN_CHECKED`
TMP=$WORKDIR/tmpfile

maillist=administrator

LINE_TOTAL=`wc -l $FILE_CHECK |awk '{print $1}'`
((LINE_TOTAL++))
echo $LINE_CHECKED >tmp1file
more +$LINE_CHECKED $FILE_CHECK|grep -e "ORA_" -e "error" -e "failure" -e "shutdown" -e "offline"  > $TMP
test -s $TMP && (cat $TMP|mailx -s "database on `hostname` need be check" $maillist)
echo $LINE_TOTAL> $FILELN_CHECKED

现在的情况是手工执行很正常,每次检查时从上次检查之后的行数开始。
但是放在cron里面就不行,每次检查都是从头开始,因此每次到会检测到大量的报错,然后发出邮件。

附上crontab
*/5 * * * * . .bash_profile;/home/oracle/archive_check/check_oracle_file.sh

论坛徽章:
0
2 [报告]
发表于 2012-07-13 10:47 |只看该作者
在contable中, 最后写这个文件$FILELN_CHECKED, 在那个目录中?

论坛徽章:
0
3 [报告]
发表于 2012-07-13 11:19 |只看该作者
chen_xun 发表于 2012-07-13 10:47
在contable中, 最后写这个文件$FILELN_CHECKED, 在那个目录中?

这个文件就在archive_check中
而且每次cron之后,我都检查这个文件的,确认该文件里面写入正确。只是不知道为什么执行的时候没有从该行开始。

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
4 [报告]
发表于 2012-07-13 11:26 |只看该作者

论坛徽章:
3
CU大牛徽章
日期:2013-03-13 15:29:07CU大牛徽章
日期:2013-03-13 15:29:49CU大牛徽章
日期:2013-03-13 15:30:19
5 [报告]
发表于 2012-07-13 11:31 |只看该作者
crontab的环境和os的环境path是不一样的,你在crontab里面输出错误日志到一个文件去看下error是什么就清楚了

论坛徽章:
0
6 [报告]
发表于 2012-07-13 13:44 |只看该作者
本帖最后由 338378WN8 于 2012-07-13 13:46 编辑

我在cron中加了 log
*/5 * * * * . .bash_profile;bash -x /home/oracle/archive_check/check_oracle_file.sh >> /home/oracle/archive_check.log 2>&1
日志情况如下
Fri Jul 13 13:35:01 CST 2012
+ HOMEDIR=/home/oracle
+ WORKDIR=/home/oracle/archive_check
+ FILE_CHECK=/u01/app/oracle/diag/rdbms/sfg/SFG/trace/alert_SFG.log
+ FILELN_CHECKED=/home/oracle/archive_check/checked_line
++ cat /home/oracle/archive_check/checked_line
+ LINE_CHECKED=4414342
+ TMP=/home/oracle/archive_check/tmpfile
+ maillist=zhoujm@coscon.com
++ wc -l /u01/app/oracle/diag/rdbms/sfg/SFG/trace/alert_SFG.log
++ awk '{print $1}'
+ LINE_TOTAL=4414351
+ (( LINE_TOTAL++ ))
++ echo 4414352 - 4414342
++ bc
+ LINE_NEED=10
+ echo 4414342
+ grep -e ORA_ -e error -e failure -e shutdown -e offline
+ more +4414342 /u01/app/oracle/diag/rdbms/sfg/SFG/trace/alert_SFG.log
+ grep -e ORA_ -e error -e failure -e shutdown -e offline
+ test -s /home/oracle/archive_check/tmpfile
+ cat /home/oracle/archive_check/tmpfile
++ hostname
+ mailx -s 'database on lxbsdb01 need be check' $maillist
+ echo 4414352
之后log中就没有其他信息了
而且我把最后一句 more +4414342 /u01/app/oracle/diag/rdbms/sfg/SFG/trace/alert_SFG.log手工执行了一下,执行结果只有几行正常运行的信息。
但是这次cron执行的结果依旧把整个日志里所有有错误的信息全部发送了出来。

论坛徽章:
0
7 [报告]
发表于 2012-07-13 14:02 |只看该作者
发现more +num命令在cron和手工输入时效果不同
*/5 * * * * more  +4414375 /u01/app/oracle/diag/rdbms/sfg/SFG/trace/alert_SFG.log|wc -l >/home/oracle/archive_check/tmp2file
然后查看结果
[oracle@lxbsdb01 archive_check]$ more tmp2file
4414384

手工执行
[oracle@lxbsdb01 archive_check]$ more  +4414375 /u01/app/oracle/diag/rdbms/sfg/SFG/trace/alert_SFG.log|wc -l
7
有谁知道这是为什么吗

论坛徽章:
0
8 [报告]
发表于 2012-07-13 16:03 |只看该作者
把more改成tail了,然后把总行数减去当前行数,然后就可以了
不过这个只能说是临时解决方法,因为如果自动作业执行过程的同时,有大量日志写入,就会有大量的行会没有读到。
看来要用sed了处理了。
sed -n $LINE_CHECKED',$p'  $FILE_CHECK
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP