调用runtime.exec()后的Java块

时间:2011-11-25 11:43:41

标签: java

首先是一些代码:

    Runtime runtime = Runtime.getRuntime();
    String args[] = new String[2];
//  args[0] = "/bin/bash";
//  args[1] = "-c";
//  args[2] = "/usr/bin/rpm2cpio "+archiveFile.getCanonicalPath()+" | /bin/cpio -idmv";
    args[0] = "/usr/bin/rpm2cpio";
    args[1] = archiveFile.getCanonicalPath();
    Process rpm2cpioProcess = runtime.exec(args, null, dir);
//  System.out.println("started rpm2cpio");

    String args2[] = new String[3];
    args2[0] = "/bin/cpio";
    args2[1] = "-idmu";
    args2[2] = "--quiet";
    Process cpioProcess = runtime.exec(args2, null, dir);
//  System.out.println("started cpio");

    InputStream fromRpm2cpio = rpm2cpioProcess.getInputStream();
    new ProcessInputStreamer(rpm2cpioProcess.getErrorStream());
    OutputStream fromCpio = cpioProcess.getOutputStream();
    new PipedStreamer(fromRpm2cpio, fromCpio);
    new ProcessInputStreamer(cpioProcess.getErrorStream());
//  System.out.println("pipe created");
    while(cpioProcess!=null && fromRpm2cpio!=null) {
        boolean doSleep = true;
//      System.out.println("waking up");
        if (cpioProcess!=null) {
            try {
                if (cpioProcess.exitValue()==0) {
                    cpioProcess = null;
                    doSleep = false;
                }
            } catch(IllegalThreadStateException e) {
            }
        }
        if (rpm2cpioProcess!=null) {
            try {
                if (rpm2cpioProcess.exitValue()==0) {
                    rpm2cpioProcess = null;
                    doSleep = false;
                }
            } catch(IllegalThreadStateException e) {
            }
        }
        if (doSleep) {
            Thread.sleep(30);
        }
//      System.out.println("still running");
    }

我正在尝试提取rpm存档的内容。经过多次修改后,此代码工作正常。我的第一次尝试是通过Java执行下一个代码:

/bin/bash -c '/usr/bin/rpm2cpio <archive-file> | /bin/cpio -idmv'

我第一次运行时工作正常(你可以在上面评论的代码中看到它)。我第二次运行代码,因为提取的文件已经存在,所以它被阻止了。所以我想也许它与管道有关,因此将调用分成两个独立的过程。这也没有多大帮助。然后我将/ bin / cpio的参数从'-idmv'修改为'-idmu --quiet',现在它可以工作了。不幸的是,-u选项“无条件地”覆盖现有文件,这并不是真正需要的。我的问题是为什么它用-idmv阻塞,为什么它不用-idmu阻塞?

2 个答案:

答案 0 :(得分:2)

它可能正在等待某些输入的标准输入。将标准输入和/或输出重定向到/ dev / null

答案 1 :(得分:1)

我猜你的ProcessInputStreamer和/或PipedStreamer实现了Runnable或extent Thread,而你并没有在任何地方运行它们。