0

問題があります。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();
    }
}

お手伝いありがとうございます!

4

1 に答える 1

2

ここでは矛盾する目標があります。スクリプトが終了するのを待たずに続行したい (つまり、JBoss を実行したい) と同時に、結果を知りたい場合です。タイムマシンを構築しない限り、これは不可能です。

できることは、別のスクリプト内でスクリプトを開始できることですstart.sh

#!/bin/bash

nohup base -c ./Run.sh > /dev/null &

bash -c注: 実行可能にすることで省略できRun.shます。

このスクリプトはRun.shバックグラウンド プロセスとして開始され、すぐに終了します。ただし、JBoss が起動できなくても、後で発生するため、エラーは発生しません。

このジレンマに対する 1 つの解決策は、JBoss のログ ファイルを数秒間、または「JBoss が正常に開始されました」というテキスト行が表示されるまで読み取るスクリプトです。

これを行うには、開始スクリプトを使用し、Java コードで JBoss のログ ファイルの読み取りを開始します (最初に表示されるまで待つ必要がある場合があります)。

この種のトリックでは、JBoss を起動する前に古いログ ファイルを最初に削除することをお勧めします。そうしないと、JBoss がまだ新しいログの書き込みを開始しようとしている間に、Java プログラムが古いログ ファイルを読み取って処理を続行する可能性があります。

于 2013-08-28T15:30:46.430 に答える