KSH中包装脚本的退出状态不正确

时间:2013-01-10 14:43:42

标签: linux shell wrapper ksh teradata

我们有一个Teradata TPT实用程序的包装脚本。包装器脚本非常简单,但问题是包装器的退出状态与实用程序的退出状态不同。在许多情况下,即使实用程序失败,脚本也会返回0。我已将退出状态保存在单独的变量中,因为在退出之前需要完成一些步骤,但是使用此变量的值退出似乎不起作用。或者,即使日志明确指定其他状态,即使出现某些故障,实用程序也会返回状态0?

更糟糕的是,此行为非常随机,有时脚本会因实用程序的退出状态而失败。我想确定实用程序的退出状态是否存在问题。

脚本通过KSH运行。包装器脚本的最后一部分是:

tbuild -f $sql.tmp -j ${id}_$JOB >$out 2>&1
ret_code=$?

cd ${TWB_ROOT}/logs
logpath=`ls -t ${TWB_ROOT}/logs/${id}_${JOB}*.out |head -1`
logpath1=${logpath##*/}
logname=${logpath1%-*}

tlogview -l ${logpath} > /edw/$GROUP/tnl/jobs/$JOB/logs/tpt_logs/${logname}.log

###Mainting 3 tpt binary log files
if [ $ret_code -eq 0 ] 
then 
    binout=$TPTLOGDIR/${logname}.dat
    binout1=$TPTLOGDIR/${logname}.dat1
    binout2=$TPTLOGDIR/${logname}.dat2

    [ -f $binout1 ] && mv $binout1 $binout2
    [ -f $binout ]  && mv $binout  $binout1

    mv "$logpath" "/edw/${GROUP}/tnl/jobs/$JOB/logs/tpt_logs/${logname}.dat"
fi

rm -f $sql.tmp
echo ".exit"
exit $ret_code

提前感谢您的帮助和建议。

2 个答案:

答案 0 :(得分:2)

脚本看起来没问题,应该确实返回与tbuild实用程序相同的退出代码。

归结为具体产品的知识。

我从未使用过任何这些产品,但Teradata为并行传输器提供了充足的用户指南,并带有明确的Post-Job Considerations部分警告:

  

即使作业成功完成,仍可能需要根据作业日志和错误表中的错误和警告信息执行操作。

从技术上讲,工作可能会完成,但结果可能会不时变化。

我猜你必须定义自己的策略并扫描日志文件以获取警告和错误消息的模式,然后为语义故障生成自己的退出代码。 logstashsplunk等工具可能派上用场。


顺便说一句,您可以考虑使用logrotate来轮播$TPTLOGDIR/${logname}.dat个文件。

答案 1 :(得分:1)

事实证明问题出在公用事业本身,正如所怀疑的那样。 Shell脚本工作正常。