【问题标题】:Getting exit value of a shell script 255 every time每次获取shell脚本的退出值255
【发布时间】:2011-09-17 02:14:49
【问题描述】:

我有一个 jar 说 test.jar,它的主类是 TestJar,一个 shell 脚本 jar_executor.sh 和一个 java 文件。如果我们将 1 作为参数传递,我的 test.jar 将返回 1,如果我们传递任何其他值,则返回 2。 我的 shell 脚本正在执行 test.jar 如下

#!/usr/bin/ksh
java TestJar 1 -cp test.jar
return_code=$?
exit $return_code 

在 java 文件中,我正在创建一个进程并执行 shell 脚本并使用以下代码获取其退出值

Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec(sh jar_executor.sh);
int exitVal = process.waitFor();
System.out.println(exitVal);

这个 exitVal 变量应该根据我们传递的参数打印 1 或 2,但它每次都打印 255。 如果我在 shell 脚本中使用echo $return_code,那么我得到的值是正确的。 请帮助我为什么使用exit 获得价值 255。提前谢谢!!!

【问题讨论】:

  • 255 表示退出代码遥不可及,我认为参数正在一起传递或其他东西
  • 执行 shell 脚本的更简单方法是 set -e; java TestJar 1 -cp test.jar。 -e 选项意味着如果任何命令以非零状态退出,bash 将立即以该状态退出。这有点像 shell 脚本的异常处理。

标签: java shell ksh


【解决方案1】:

255 或 -1 是应用程序定义的退出代码,您必须阅读代码才能知道它的含义。

正常退出的Java应用程序,返回0,如果抛出异常,返回1。

【讨论】:

    【解决方案2】:

    转到您的工作区库,workspace.metadata.plugins\org.eclipse.e4.workbench 并删除工作台文件:)。之后你就可以重启eclipse了

    【讨论】:

      【解决方案3】:

      看起来这可能是一个 Java 错误。其他人报告的问题与您所看到的类似;看到这个Java bug report。 Java 开发人员认为没有错误,但我很怀疑。 JRE 用于从生成的进程获取返回值的代码很复杂,如果存在竞争条件或其他并发错误,我不会感到惊讶。

      我猜如果生成的进程很快退出,JRE 将无法捕获返回码。如果我的怀疑是正确的,在你的 shell 脚本中添加sleep 1 将使它工作。

      【讨论】:

        【解决方案4】:

        您的 shell 脚本没有正确调用 java:

        java TestJar 1 -cp test.jar
        

        在提及主类名之前,您需要设置 java 命令的选项。主类名之后的所有参数都是主类的参数,不再是 java VM 的选项。因此,在您的情况下,没有为 java 指定类路径。我在执行脚本时收到以下错误消息:错误:无法找到或加载主类 TestJar。要修复,您只需重新排序 jar_executor.sh 脚本中的参数:

        java -cp test.jar TestJar 1
        

        我无法在我的 PC 上重现 255,所以我只能猜测它的来源:当您的 java 命令无法加载主类或您的 korn shell (/usr /bin/ksh) 在脚本中止时设置此返回值。

        以下是我使用的所有来源:

        jar_executor.sh

        #!/bin/sh -e
        
        java -cp test.jar TestJar 2
        return_code=$?
        exit $return_code
        

        TestJar.java

        public class TestJar {
            public static void main(final String[] args) {
                System.exit(Integer.parseInt(args[0]));
            }
        }
        

        JarRunner.java

        import java.io.IOException;
        
        public class JarRunner {
            public static void main(final String[] args) throws IOException, InterruptedException {
                final Runtime runtime = Runtime.getRuntime();
                final Process process = runtime.exec("sh jar_executor.sh");
                final int exitVal = process.waitFor();
                System.out.println(exitVal);
            }
        }
        

        当我现在运行 java -cp bin JarRunner 时,我得到了预期的输出 2

        【讨论】:

          【解决方案5】:

          您可能在调用脚本时出错了。试试:

          Process process = runtime.exec("sh -c jar_executor.sh");
          

          注意“-c”标志,这意味着您正在调用 shell 来执行命令。

          【讨论】:

          • 添加“-c”标志会使事情变得更糟,因为现在 jar_executor.sh 脚本也需要执行权限(“x-flag”)。没有“-c”标志,它的工作独立于 shell 脚本的权限。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-12-11
          • 1970-01-01
          • 1970-01-01
          • 2017-05-18
          • 1970-01-01
          • 2013-01-26
          • 1970-01-01
          相关资源
          最近更新 更多