【问题标题】:Incorrect exit status of wrapper script in KSHKSH 中包装脚本的退出状态不正确
【发布时间】:2012-12-24 23:45:23
【问题描述】:

我们有一个 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

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

【问题讨论】:

  • 该代码是函数的一部分吗?如果是这样,哪种格式,my_fn () { ... } OR function my_fn { ... }?如果您指出uname -aecho ${.sh.version} 的结果,可能会有所帮助。祝你好运。
  • uname -a 给出了 Linux tpls 2.6.18-164.el5 #1 SMP Tue Aug 18 15:51:48 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux echo ${.sh.version} 给出了错误的替换错误。实际上没有环境变量sh。我正在使用 KSH,ksh --version 返回version sh (AT&T Research) 93s+ 2008-01-31。任何进一步的建议将不胜感激。谢谢你的时间:)
  • 不,这个块不是任何函数的一部分。
  • 您的实用程序是否曾经返回负退出代码?过去我遇到过 shell 无法很好处理这些问题的问题......
  • 在这种情况下,只需在第二行后面加上logger -t mydebugging "tbuild exited with $ret_code"

标签: linux shell wrapper ksh teradata


【解决方案1】:

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

这取决于对特定产品的了解。

我从未使用过任何这些产品,但 Teradata 有一个充足的 Parallel Transporter 用户指南,其中包含明确的 Post-Job Considerations 部分,警告:

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

所以从技术上讲,一项工作可能会完成,但结果可能会不时发生变化。

我猜您必须定义自己的策略并扫描日志文件以查找警告和错误消息的模式,然后生成您自己的退出代码以解决语义故障。 logstashsplunk 之类的工具可能会派上用场。


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

【讨论】:

  • 谢谢 Henk Langeveld!问题出在实用程序本身,开发团队在下一次产品更新中修复了它。您从文档中指定的警告与特定于加载/卸载实用程序的 Teradata 的另一个功能相关(丢弃的行进入错误表以违反唯一性或进入另一个错误表以解决数据转换问题)。
  • 另外,感谢logrotate 的提示。这看起来是个有用的工具。
  • @xenodevil 好。所以这是tbuild 中的一个错误。添加您自己的答案并接受,以便人们知道这是如何解决的。
  • 完成。感谢您的支持
【解决方案2】:

事实证明问题出在实用程序本身,正如怀疑的那样。 Shell 脚本运行良好。

【讨论】:

    猜你喜欢
    • 2020-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-17
    相关资源
    最近更新 更多