1

我正在使用 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();
4

1 回答 1

1

我认为这两行的顺序错误:

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

应该是这样的(允许进程完成它的输出):

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

编辑

仍然不是 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();
    }
}
于 2011-08-03T11:09:38.740 回答