1

ProcessBuilder を使用して、Java アプリケーション (ホスト) から新しいプロセス (子) を開始します。このようなもの:

ProcessBuilder processBuilder = createProcess(commandLine);
processBuilder.directory(new File(baseDir));
processBuilder.redirectErrorStream(true);
Process process = null;
try {
    process = processBuilder.start();
} catch (Exception e) {
    e.printStackTrace();
}

子プロセスが開始されていることをシステム モニターで確認できますが、ホスト アプリケーションを停止しない限り機能しません。より具体的には、子プロセスはサーバーであり、ProcessBuilder で開始した後、ホスト アプリケーションがまだ実行されている場合、リクエストに応答しません。さらに、サーバーが使用しているポートは引き続き使用できます。ホスト アプリケーションを停止すると、サーバーはすぐに動作を開始します。私が見逃したものはありますか、それとも ProcessBuilder がどのように機能すると思われますか? よろしくお願いします。

4

2 に答える 2

2

ほとんどの場合、プロセスの標準出力バッファが空になるまでプロセスは終了しません。プロセスがこのバッファーをいっぱいにして停止した可能性があります (何らかの理由で)

プロセスの標準出力を (経由でProcess#getInputStream) 使用してみて、違いが生じるかどうかを確認してください。

プロセスがユーザーの入力を待っている可能性もあります。

出力が得られず、おそらくマシンがコードでハングする例を見てください

于 2013-03-08T22:43:06.713 に答える
0

@MadProgrammerは正しいです。私は問題を修正することができました、そして私はコード例で私の質問に答えたいです。それは他の人にも役立つかもしれません。開始後、子プロセスから標準を消費する必要があります。このようなもの:

        process = processBuilder.start();
        InputStream is = process.getInputStream();
        INputStreamReadr isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);
        String line;
        while (!stopProcess) {
            if (br.ready()) {
                line = br.readLine();
                System.out.println(line);
            }
        }
于 2013-03-11T22:35:23.137 に答える