java – Process Builder的waitFor()问题和打开的文件限制
发布时间:2020-12-14 05:33:08 所属栏目:Java 来源:网络整理
导读:我继承了一些代码: Process p = new ProcessBuilder("/bin/chmod","777",path).start();p.waitFor(); 基本上,有一些基于古代和高度巫术的原因,将键/值对存储在磁盘上作为文件.我真的不想进去 但是,我留下了一堆IO异常: Exception :Cannot run program "/bi
我继承了一些代码:
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 一堆我的意思是在10万千万的领域 我得到waitFor调用是为了阻止这些发生等待进程完成并退出,但是我认为chmod在文件实际关闭之前返回一个结果.有人知道这是否会成为这些例外的原因? 我的另一个倾向是,数千个文件的打开和关闭在java端没有足够快的发生,还有其他的事情,也许有些形式的文件缓冲区没有被清除,正在调用fw.close(). 我对java很新,这是一个让我失望的怪异怪物. (很高兴应用程序仍然运行某种方式..在吐出一个非常大的日志文件后) 任何人都可以想办法解决这个问题,清除缓冲区或将文件的开放限制增加到jvm可以跟上自己的位置(假设是问题) 解决方法
我假设你正在一个循环中运行这些chmod命令 – 否则我不明白为什么你会得到这么多异常.您可能会遇到死锁,因为您没有读取生成的进程的输出.这当然是用来在我们之前的ProcessBuilder Runtime.exec()日子里咬我的.
将您的代码段更改为上述模式: try { ProcessBuilder pb = new ProcessBuilder("/bin/chmod",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),看看是否有助于这种情况. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |