При попытке запустить подпроцесс он печатает только стандартный вывод, затем завершается - PullRequest
1 голос
/ 03 августа 2011

Я использую Apache Commons Exec и пытаюсь запустить подпроцесс, который будет работать в течение всего времени работы приложения. Он должен начать процесс, принять две команды ввода и просто оставаться в фоновом режиме. Теперь он принимает только одну команду (по крайней мере, то, что показывает 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();

1 Ответ

1 голос
/ 03 августа 2011

Я думаю, что эти две строки расположены в неправильном порядке:

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

Должно быть так (чтобы процесс завершил вывод):

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

EDIT

Все еще не уверен на 100%, что вы ищете, но, кажется, я пропустил часть "просто остаться в фоновом режиме" в вашем первоначальном запросе. Один из способов добиться этого - использовать пару 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();
    }
}
...