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

标签 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

预先感谢您的帮助和建议。

最佳答案

该脚本看起来不错,并且确实应该返回与 tbuild 实用程序相同的退出代码。

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

我从未使用过这些产品,但 Teradata 有一份丰富的并行传输器用户指南,其中有明确的 Post-Job Considerations部分,警告:

Even if the job completed successfully, action may still be required based on error and warning information in the job logs and error tables.

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

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


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

关于linux - KSH 中包装器脚本的退出状态不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14260454/

相关文章:

iphone - 修改 usr/bin 后可执行文件中的 CPU 类型错误

c - 如何用指向存储在另一个数组中的字符串的指针填充字符指针数组?

windows - gmake 使用 sh.exe 会导致构建错误

java - 使用 putIfAbsent 重叠 ConcurrentHashMap put

c++ - 如何从类中包装的成员访问包装类的成员

c# - 调用 Caffe 的 C++/CLI 包装器时出现 AccessViolationException

c - setsockopt SO_SNDBUF 及其在 unix 域中的行为

python - Ubuntu Command 'pip' not found,但有18个类似的

linux - 如何从 tar 站点备份中提取单个文件

bash - "=~"运算符在 shell 脚本中有什么作用?