java - Process Builder waitFor() 问题和打开文件限制

标签 java java-io processbuilder

我继承了一些代码:

Process p = new ProcessBuilder("/bin/chmod", "777", path).start();
p.waitFor();

基本上,将键/值对作为文件存储在磁盘上是出于一些古老且高度基于巫术的原因。我真的不想深入。

但是,我留下了一堆 IO 异常:

Exception :Cannot run program "/bin/chmod": java.io.IOException: error=24, Too many open files
Message: Cannot run program "/bin/chmod": java.io.IOException: error=24, Too many open files

我的意思是在 10k 到数百万的范围内

我感觉 waitFor 调用是为了阻止这些发生,等待进程完成并退出,但是我认为 chmod 在文件实际关闭之前返回结果。有谁知道这是否会导致这些异常?

我的另一个倾向是,在 Java 端打开和关闭数以千计的文件的速度不够快,还有其他事情正在发生,也许是某种形式的文件缓冲区没有得到在调用 fw.close() 时清除。

我是 java 的新手,这是一个让我难过的奇怪的东西。 (很高兴应用程序仍然以某种方式运行......在吐出一个非常大的日志文件之后)

其他人能想出办法解决这个问题吗,清除缓冲区或将文件打开限制增加到 jvm 可以跟上自身的速度(假设这是问题所在)

最佳答案

我假设您正在循环运行这些 chmod 命令 - 否则我不明白为什么您会得到这么多异常。您可能遇到了死锁,因为您没有读取衍生进程的输出。在 ProcessBuilderRuntime.exec() 出现之前的日子里,这肯定让我很反感。

将您的代码片段更改为上述模式:

try {
    ProcessBuilder pb = new ProcessBuilder("/bin/chmod", "777", path);    
    pb.redirectErrorStream(true); // merge stdout, stderr of process

    Process p = pb.start();
    InputStreamReader isr = new  InputStreamReader(p.getInputStream());
    BufferedReader br = new BufferedReader(isr);

    String lineRead;
    while ((lineRead = br.readLine()) != null) {
        // swallow the line, or print it out - System.out.println(lineRead);
    }

    int rc = p.waitFor();
    // TODO error handling for non-zero rc
}
catch (IOException e) {
    e.printStackTrace(); // or log it, or otherwise handle it
}
catch (InterruptedException ie) {
    ie.printStackTrace(); // or log it, or otherwise handle it
} 

(信用:this site)看看这是否有助于解决问题。

关于java - Process Builder waitFor() 问题和打开文件限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1129441/

相关文章:

java - 尝试播放音频文件时 JLayer 异常

java - 如何刷新面板?

java - 从java读取Xml文件

java - 随机访问文件 FileLock : java. io 与 java.nio

java - 使用 Processbuilder 运行 jar 无法正常工作

java - Android sqlite创建数据库错误

java - 从文件中读取前 5 行,然后读取其余行

java - 使用 ProcessBuilder 执行 Linux 命令并从 reader.readLine() 获取 NULL,尽管行数为 102

java - ProcessBuilder BufferedReader read() 阻塞

java - 如何在java中用数字(坐标)分割字符串?