shell加到crontab里的问题(二)

这个问题有点特殊,花了我近一个礼拜的时间才解决。

简言之,就是加入到crontab中的shell脚本,执行时前面会自动加上sh命令。这样对于用bash, csh等shell写的脚本,如果使用了默认的sh不支持的特殊功能,则将其加入crontab中时,调用的脚本前要强制加上/usr/bin/bash等指定所用shell的语句。

[@more@]

问题:

有三个shell脚本,refresh_all, refresh_schema, refresh_table,其中refresh_all调用refresh_schema,refresh_schema调用refresh_table。

手动执行$refresh_all时,程序能正常执行,且结果正确。将其加入crontab:

33 06 * * 1,2,3,4,5 /erdb/bin/refresh_all

执行中发现调用refresh_table时出错。

查看mail,错误内容如下:

$mail

From opserdb Fri Jan 14 06:47:27 2005
Date: Fri, 14 Jan 2005 06:47:27 GMT
From: Operations ERDB
Message-Id: <200501140647.j0E6lRp15696@gecfsprd11.com>
To: opserdb
Subject: Output from "cron" command
Content-Length: 264

Your "cron" job on gecfsprd11
/erdb/bin/refresh_all>/erdb/log/refresh_all_cron.log

produced the following output:

/erdb/bin/refresh_table: test: argument expected
/erdb/bin/refresh_table: test: argument expected
/erdb/bin/refresh_table: test: argument expected

shell脚本中的相关内容

$cat refresh_all
#!/usr/bin/bash
ORACLE_SID=perdb ; export ORACLE_SID
.....
/erdb/bin/refresh_schema EDENFR edenfr_2004 EWRFRMASTER ewrfrmaster

$cat refresh_schema
..
elif [ $OBJECT_TYPE = "T" ]; then
SQL_FILE=${OBJECT_NAME}_fr.sql
/erdb/bin/refresh_table $SQL_FILE $SCHEMA $SCHEMA_PASS
..

解决过程:

将问题反映到多个地方,都没有得到解决方法或者解决思路。

自己在测试中发现如果运行 $refresh_table eden_flat_ord_cmpt_fr.sql edenfr edenfr_2004 则可以运行,且结果正确。

如果运行 $sh refresh_table eden_flat_ord_cmpt_fr.sql edenfr edenfr_2004 则出现同crontab一样的错误:

refresh_table: test: argument expected

再问人家的时候,才知道refresh_table里使用了sh不支持的功能。

确实如此,refresh_table里适用了语句

TABLE_NAME=`echo ${1%_*}|cut -d"/" -f 3`

这个功能目前所知只在bash里支持。

解决办法:

在refresh_schema中,调用refresh_table的语句改成如下

$cat refresh_schema
..
elif [ $OBJECT_TYPE = "T" ]; then
SQL_FILE=${OBJECT_NAME}_fr.sql 
/usr/bin/bash /erdb/bin/refresh_table $SQL_FILE $SCHEMA $SCHEMA_PASS

..

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/207/viewspace-787325/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/207/viewspace-787325/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值