Установите ulimit -n из Java - PullRequest
0 голосов
/ 11 марта 2019

Я пытаюсь установить 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 даже изменяется или нет.

Ответы [ 2 ]

1 голос
/ 11 марта 2019
Команда

ulimit обновляет пределы текущего процесса и всех унаследованных процессов.Когда вы вызываете ulimit, используя Runtime.exec или ProcessBuilder, он запускает новый процесс и обновляет ограничения этого нового процесса, не влияя на текущий процесс Java.

чтобы применить новые ограничения к себе, Java-процесс должен вызвать функцию setrlimit в своем собственном контексте.Поскольку для этой функции нет Java-оболочки, ее можно вызывать только через собственный интерфейс: JNI, JNA или JNR.

Однако, если Java запускается под непривилегированным пользователем, обновление ограничения файла (ulimit -n)в любом случае бесполезно, потому что HotSpot JVM автоматически обновляет этот предел до максимально допустимого значения - см. этот вопрос .

0 голосов
/ 13 апреля 2019

Я сделал обходной путь, который работает.Я использовал сценарий оболочки, который выполнял Java-программу.Итак, я установил ulimit до того, как сценарий оболочки выполнил часть running-the-java.Как ответил @apangin, этот набор ulimit процесса оболочки и java-процесс, порожденный этим процессом оболочки, унаследовали этот ulimit.

...