У меня странная проблема с 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
передается на ExecutorService
фиксированного размера (35). Остальная часть приложения ждет, пока все они завершатся - это реализовано с помощью 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...
Есть ли у кого-нибудь идеи, что это значит? Судя по результатам поиска google/bing для java.io.IOException: error=11
, это не самое распространенное исключение, и я совершенно озадачен.
Мое дикое и не очень обоснованное предположение заключается в том, что у меня слишком много потоков, пытающихся запустить один и тот же файл в одно и то же время. Однако, чтобы воспроизвести эту проблему, требуются часы процессорного времени, поэтому я не пробовал с меньшим числом.
Любые предложения будут высоко оценены.