从bash调用java程序失败时检测

问题描述 投票:0回答:2

我有一个非常简单的bash脚本,它调用Java程序。如果Java程序成功运行或失败,我需要此bash脚本将输出写入stdout。

#!/bin/bash
if java -jar java_program.jar arg1 ; then echo "run:yes"
    else echo "run:no"
fi

如果我的java程序返回

java.lang.ArrayIndexOutOfBoundsException在java.lang.System.arraycopy(本机方法)在com.redacted.redacted.AdvancedEncryptionStandard.decrypt(AdvancedEncryptionStandard.java:48)在com.redacted.redacted.App.getStuff(App.java:58)在com.redacted.redacted.App.main(App.java:27)

我的bash脚本仍将返回“ run:yes”。我假设这是因为就bash而言,它称为脚本并已运行。我有办法确定Java程序是否成功运行吗?

java bash
2个回答
0
投票

是,可以。但是您必须从Java程序内部使用System.exit(0)完成执行并与bash交流,一切都OK。只需返回1而不是0即可传达错误。响应将存储在bash环境中的$?中,以在if中使用。

关于如何在bash上使用$?结果还有另一个答案:

https://unix.stackexchange.com/questions/22726/how-to-conditionally-do-something-if-a-command-succeeded-or-failed


0
投票

通常退出'main'方法(没有显式退出)将向外壳返回'0'。未捕获的异常将返回状态1。

javac a
java a
xception in thread "main" java.lang.Exception
    at a.main(a.java:4)

echo $?
=> 1

a在哪里

class a {
    public static void main(String [] args) throws Exception {
        System.out.println("Hello\n") ;
        throw new Exception() ;
    }
}

表面上,这是main仅捕获异常,将其打印,然后忽略该异常,因此调用进程返回0的情况,>

class a {
    public static void main(String [] args) {
        System.out.println("Hello\n") ;
        try {
          doSomething() ;
        } catch (Exception e) {
           e.printStackTrace) ;
        } ;
    }
}

几种可行的方法:(1)重写main以允许异常“冒泡”,(2)编写将执行旧main的新main,并检查是否成功(3)捕获stderr,并检查错误消息(凌乱)。否则,您很不走运

© www.soinside.com 2019 - 2024. All rights reserved.