我正在尝试设置我的java程序运行的ulimit。目前看来,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是否正在被修改。
发布于 2019-03-11 17:06:32
ulimit命令更新当前进程和所有继承进程的限制。当您使用ulimit或Runtime.exec调用ProcessBuilder时,它将启动一个新进程并更新这个新进程的限制,而不会对当前的ProcessBuilder进程产生任何影响。
为了对自身应用新的限制,Java应该在自己的上下文中调用setrlimit函数。因为这个函数没有Java包装器,所以只能通过本机接口JNI、JNA或JNR调用它。
但是,如果Java在非特权用户下运行,那么无论如何更新文件限制(ulimit -n)都是无用的,因为HotSpot会自动将这个限制更新为最大允许值--参见this question。
发布于 2019-04-13 16:35:28
我做了个有效的解决办法。我使用了一个执行java程序的shell脚本。因此,在shell脚本执行运行中的-java部分之前,我设置了ulimit。正如@apangin所回答的,这个设置了shell进程和从这个shell进程派生出来的java进程的ulimit,继承了这个ulimit。
https://stackoverflow.com/questions/55099287
复制相似问题