【问题标题】:While trying to run subprocess it prints only stdout then terminates在尝试运行子进程时,它只打印标准输出然后终止
【发布时间】:2011-10-18 21:24:19
【问题描述】:

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

【问题讨论】:

    标签: java subprocess apache-commons-exec


    【解决方案1】:

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

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

    【讨论】:

    • 我想你不明白我的意思。 IT 打印 command1 然后终止。甚至不等待输入。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-07
    • 2012-09-29
    • 2011-05-23
    • 2013-06-29
    • 2019-03-23
    相关资源
    最近更新 更多