为此苦苦挣扎了一个小时...Java代码:
ULogger.info("throwing out 666!");
System.exit(666);
bash 包装器:
eval ${COMMAND_TO_RUN}
ret_code=$?
printf "error code : [%d]" ${ret_code}
输出:
[2012-11-30 15:20:12,971][INFO ] throwing out 666!
error code : [0]
这是怎么回事?谢谢。。。
[编辑]
${COMMAND_TO_RUN}
是
((java -Xmx9000m -Dtoday_nix=20121128 -cp "/usr/lib/hadoop/conf" com.paypal.risk.ars.linking.task_fw.BaseRunnableProcess 3>&1 1>&2 2>&3) | tee /dev/tty) > batches_errors.log
你的问题出在你的COMMAND_TO_RUN
:
((java -Xmx9000m -Dtoday_nix=20121128 -cp "/usr/lib/hadoop/conf" com.paypal.risk.ars.linking.task_fw.BaseRunnableProcess 3>&1 1>&2 2>&3) | tee /dev/tty) > batches_errors.log
最后一个调用的程序是 tee
,它将以状态 0
退出,覆盖退出java
值 .
您可以使用 $PIPESTATUS
,它是管道中的返回值数组。
例如:
$ cat nonexistantFile | echo ; echo "e: $? p: ${PIPESTATUS[@]}"
预期产出:
e: 0 p: 1 0
cat
将失败(退出代码 1),回显将成功(退出代码 0)。 $?
将是0
. ${PIPESTATUS[0]}
将包含cat
(1
)的退出代码,${PIPESTATUS[1]}
回显(0
)的退出代码。
这是因为$?几乎肯定会给你eval
的返回代码,这在这里是成功的。你为什么要把eval
电话放在那里?只需致电COMMAND_TO_RUN