这个问题有点特殊,花了我近一个礼拜的时间才解决。
简言之,就是加入到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,错误内容如下:
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/