Я думаю, что эти две строки расположены в неправильном порядке:
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();
}
}