我在使用Java ProcessBuilder
时遇到了一个奇怪的问题。以下是代码(稍微简化了一下):
public class Whatever implements Runnable
{
public void run(){
//someIdentifier is a randomly generated string
String in = someIdentifier + "input.txt";
String out = someIdentifier + "output.txt";
ProcessBuilder builder = new ProcessBuilder("./whateveer.sh", in, out);
try {
Process process = builder.start();
process.waitFor();
} catch (IOException e) {
log.error("Could not launch process. Command: " + builder.command(), e);
} catch (InterruptedException ex) {
log.error(ex);
}
}
}
whatever.sh 的内容如下:
R --slave --args $1 $2 <whatever1.R >> r.log
大量的Whatever
实例被提交到一个固定大小(35)的ExecutorService
。应用程序的其余部分等待它们全部完成-使用CountdownLatch
实现。在几个小时后(Scientific Linux 5.0,java版本“1.6.0_24”),一切都运行良好,然后抛出以下异常:
java.io.IOException: Cannot run program "./whatever.sh": java.io.IOException: error=11, Resource temporarily unavailable
at java.lang.ProcessBuilder.start(Unknown Source)
... rest of stack trace omitted...
有人知道这是什么意思吗?根据对java.io.IOException: error=11
的google / bing搜索结果,这不是最常见的异常之一,我完全困惑了。
我猜测可能是有太多线程尝试同时启动同一个文件。 但是,为了重现问题,需要数小时的CPU时间,因此我尚未尝试使用较少的线程。
非常感谢任何建议。
lsof
命令检查了 Java 进程的打开文件数? - lidaobing