繁体   English   中英

尝试运行子进程时,它仅输出标准输出,然后终止

[英]While trying to run subprocess it prints only stdout then terminates

我正在使用Apache Commons Exec,并尝试启动在整个应用程序工作期间都可以工作的子流程。 它应该启动过程,接受两个输入命令,并且只停留在后台。 现在,它仅接受一个命令(至少标准输出显示)并终止。 你能帮我吗?

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();

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

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

应该是这样的(以允许该过程完成其输出):

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

编辑

仍然不能100%知道您要做什么,但认为我错过了原始请求的“只是留在后台”部分。 实现此目的的一种方法是使用PipedInputStreamPipedOutputStream对与进程进行对话。 完成后,您可以关闭输出流。 如果要在过程完成之前访问过程的输出,可以对方向相反的输出使用类似的技术。

我没有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();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM