Java 如何在没有等待结果的情况下执行sh文件?

Java 如何在没有等待结果的情况下执行sh文件?,java,linux,runtime.exec,Java,Linux,Runtime.exec,我有一个问题,我试着从java代码运行一个sh文件来启动JBoss服务器,所以当我执行这个sh文件时,我想知道它什么时候启动并打印出我的控制台。这是我的密码: public static void runStart() { try { String command = "./Run.sh"; String s = get_commandline_results(command); System.out

我有一个问题,我试着从java代码运行一个sh文件来启动JBoss服务器,所以当我执行这个sh文件时,我想知道它什么时候启动并打印出我的控制台。这是我的密码:

    public static void runStart() {
        try {
            String command = "./Run.sh";
            String s = get_commandline_results(command);
            System.out.println(s);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("done");
    }

    public static String get_commandline_results(String cmd)
            throws IOException, InterruptedException, IllegalCommandException {

        String result = "";
        Process p = null;
        p = Runtime.getRuntime().exec(String.format("bash -c %s", cmd));
        final ProcessResultReader stderr = new ProcessResultReader(
                p.getErrorStream(), "STDERR");
        final ProcessResultReader stdout = new ProcessResultReader(
                p.getInputStream(), "STDOUT");
        System.out.println("starting...");
        stderr.start();
        stdout.start();
        final int exitValue = p.waitFor();// It was delayed here because sh not complete
        System.out.println("started!");// How to go to here?
        if (exitValue == 0) {
            result = stdout.toString();
        } else {
            result = stderr.toString();
        }
        return result;
    }   
}

class ProcessResultReader extends Thread {
    final InputStream is;
    final String type;
    final StringBuilder sb;

    ProcessResultReader(final InputStream is, String type) {
        this.is = is;
        this.type = type;
        this.sb = new StringBuilder();
    }

    public void run() {
        try {
            final InputStreamReader isr = new InputStreamReader(is);
            final BufferedReader br = new BufferedReader(isr);
            String line = null;
            while ((line = br.readLine()) != null) {
                this.sb.append(line).append("\n");
            }
        } catch (final IOException ioe) {
            System.err.println(ioe.getMessage());
            throw new RuntimeException(ioe);
        }
    }

    @Override
    public String toString() {
        return this.sb.toString();
    }
}

谢谢你的帮助

您在这里的目标是矛盾的:您希望在不等待脚本终止的情况下继续(即,您希望JBoss运行),但同时,您希望知道结果。如果不建造一台时间机器,这是不可能的

您可以在另一个脚本中启动脚本
start.sh

#!/bin/bash

nohup base -c ./Run.sh > /dev/null &
注意:您可以通过使
Run.sh
可执行来省略
bash-c

此脚本将作为后台进程启动
Run.sh
,并立即退出。但是如果JBoss无法启动,您将不会得到错误,因为这将在稍后发生

解决这个难题的一个方法是,脚本读取JBoss的日志文件几秒钟,或者直到看到一行表示“JBoss已成功启动”的文本

要做到这一点,请使用start脚本,然后在Java代码中开始读取JBoss的日志文件(您可能需要先等待它出现)


对于这种技巧,在尝试启动JBoss之前,首先删除旧日志文件总是很好的。否则,Java程序可能会读取一个旧的日志文件并继续,而JBoss仍在尝试开始编写新日志。

谢谢Aaron Digulla!我想是的,在您的指导下,我将创建另一个脚本文件ex:start.sh:#/Run.sh>test.txt 2>error.txt是的,所以我必须阅读测试文件才能找到“JBoss已成功启动”对吗?请让我看看?是的,那是你必须做的。不过,除非你按小时付钱,否则我不会给你看任何东西:-)我们继续努力,让你明白你在做什么,这样你就可以自己解决你的问题。我们不为您编写代码。谢谢分享!我将自己编写代码,非常感谢!