1

私は Apache Commons Exec を使用しており、アプリケーションの全期間にわたって機能するサブプロセスを開始しようとしています。プロセスを開始し、2 つの入力コマンドを受け入れ、バックグラウンドで待機する必要があります。現在は、1 つのコマンド (少なくとも stdout が表示するもの) のみを受け入れて終了します。あなたは私を助けることができますか?

CommandLine cmdLine = new CommandLine("app.exe");
cmdLine.addArgument("argument");
DefaultExecutor executor = new DefaultExecutor();
OutputStream os = new ByteArrayOutputStream();
InputStream is = new ByteArrayInputStream(("command1;\ncommand2;\n").getBytes());
executor.setStreamHandler(new PumpStreamHandler(os,null,is));
DefaultExecuteResultHandler resultHandler = new DefaultExecuteResultHandler();
executor.execute(cmdLine,resultHandler);
System.out.println(os.toString());
resultHandler.waitFor();
4

1 に答える 1

1

次の 2 行の順序が間違っていると思います。

    System.out.println(os.toString());
    resultHandler.waitFor();

次のようにする必要があります(プロセスが出力を完了できるようにするため):

    resultHandler.waitFor();
    System.out.println(os.toString());

編集

あなたが何を求めているのかまだ 100% 確信が持てませんが、元のリクエストの「バックグラウンドにとどまる」という部分を見逃していたと思います。これを実現する 1 つの方法は、PipedInputStream&PipedOutputStreamペアを使用してプロセスと対話することです。完了したら、出力ストリームを閉じることができます。プロセスが終了する前にプロセスからの出力にアクセスしたい場合は、方向を逆にして出力に同様の手法を使用できます。

私は便利なWindowsマシンを持っていませんが、次のように動作します:

public static void main(String[] args) {
    try {
        CommandLine cmdLine = new CommandLine("/bin/bash");
        DefaultExecutor executor = new DefaultExecutor();
        OutputStream os = new ByteArrayOutputStream();
        PipedOutputStream pos = new PipedOutputStream();
        PipedInputStream  pis = new PipedInputStream(pos);
        executor.setStreamHandler(new PumpStreamHandler(os, null, pis));
        DefaultExecuteResultHandler resultHandler = new DefaultExecuteResultHandler();
        executor.execute(cmdLine, resultHandler);

        PrintWriter pw = new PrintWriter(pos);
        pw.println("ls -l /usr");
        pw.println("pwd");
        pw.close();
        resultHandler.waitFor();
        System.out.println(os.toString());
    } catch (Exception e) {
        e.printStackTrace();
    }
}
于 2011-08-03T11:09:38.740 に答える