Я пытаюсь установить ulimit, под которым работает моя java-программа. В настоящее время кажется, что для ulimit -n установлено значение 4096, потому что когда я запускаю этот код (который является частью моей Java-программы), он выводит 4096.
ProcessBuilder processBuilder = new ProcessBuilder("/bin/bash", "-c", "ulimit -n");
try {
Process process = processBuilder.start();
// Prints 4096.
LOGGER_.info(getStringFromInputStream(process.getInputStream()));
} catch (IOException e) {
// The flow does not reach this catch block.
LOGGER_.error("exception caught: " + e.getMessage());
}
Можно ли его поменять на что-то другое, скажем 8192? Я пробовал это:
ProcessBuilder processBuilder2 = new ProcessBuilder("/bin/bash", "-c", "ulimit -n 8192");
try {
Process process = processBuilder2.start();
LOGGER_.error("starting agent2...");
LOGGER_.error(getStringFromInputStream(process.getInputStream()));
} catch (IOException e) {
LOGGER_.error("exception caught2: " + e.getMessage());
}
а также
try {
String[] cmdString = new String[3];
cmdString[0] = "/bin/bash";
cmdString[1] = "-c";
cmdString[2] = "ulimit -n 8192";
Process process = Runtime.getRuntime().exec(cmdString);
LOGGER_.error(getStringFromInputStream(process.getInputStream()));
} catch (IOException e) {
LOGGER_.error("exception caught:" + e.getMessage());
}
Но я не уверен, что это правильный способ сделать это. Кроме того, если ulimit -n даже изменяется или нет.




Команда ulimit обновляет ограничения процесса ток и всех унаследованных процессов. Когда вы вызываете ulimit с помощью Runtime.exec или ProcessBuilder, он запускает новый процесс и обновляет ограничения этого процесса новый, не влияя на текущий процесс Java.
Чтобы применить к себе новые ограничения, Java-процесс должен вызывать функцию setrlimit в своем собственном контексте. Поскольку для этой функции нет Java-обертки, ее можно вызвать только через нативный интерфейс: JNI, JNA или JNR.
Однако, если Java работает под непривилегированным пользователем, обновление ограничения файла (ulimit -n) в любом случае бесполезно, поскольку HotSpot JVM автоматически обновляет это ограничение до максимально допустимого значения — см. этот вопрос.
Я сделал обходной путь, который работает. Я использовал сценарий оболочки, который выполнял программу Java. Итак, я установил ulimit до того, как сценарий оболочки выполнит часть запуска Java. Как ответил @apangin, это устанавливает ulimit процесса оболочки, и процесс java, порожденный этим процессом оболочки, унаследовал этот ulimit.