每次都获得shell脚本255的退出值

时间:2011-06-17 10:42:02

标签: java shell ksh

我有一个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脚本并将其exitvalue与以下代码

一起使用
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。在此先感谢!!!

5 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

我猜测如果生成的进程很快退出,则JRE无法捕获返回代码。如果我的怀疑是正确的,将sleep 1添加到您的shell脚本将使其正常工作。

答案 3 :(得分:0)

您的shell脚本未正确调用java:

java TestJar 1 -cp test.jar

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

java -cp test.jar TestJar 1

我无法在我的电脑上重现255,所以我只能猜测它来自哪里:当你的java命令无法加载主类或你的korn shell时,你的java命令会返回错误代码而不是1(/ 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

答案 4 :(得分:-1)

调用脚本可能不对。尝试:

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

请注意“-c”标志,表示您正在调用shell来执行命令。