从 java 设置 ulimit -n
Set ulimit -n from java
我正在尝试设置我的 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 是否被修改。
ulimit
命令更新 当前 进程和所有继承进程的限制。当您使用 Runtime.exec
或 ProcessBuilder
调用 ulimit
时,它会启动一个新进程并更新此 new 进程的限制,而不会影响当前 Java进程。
为了对自身应用新的限制,Java 进程应该在它自己的上下文中调用 setrlimit
函数。由于此函数没有 Java 包装器,因此只能通过本机接口调用:JNI、JNA 或 JNR。
但是,如果 Java 在非特权用户下运行,则更新文件限制 (ulimit -n
) 无论如何都是无用的,因为 HotSpot JVM 会自动将此限制更新为最大允许值 - 请参阅 this question .
我做了一个可行的解决方法。我正在使用执行 java 程序的 shell 脚本。因此,我在 shell 脚本执行 运行-the-java 部分之前设置了 ulimit。正如@apangin 所回答的,这设置了 shell 进程的 ulimit 和从这个 shell 进程产生的 java 进程,继承了这个 ulimit。
我正在尝试设置我的 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 是否被修改。
ulimit
命令更新 当前 进程和所有继承进程的限制。当您使用 Runtime.exec
或 ProcessBuilder
调用 ulimit
时,它会启动一个新进程并更新此 new 进程的限制,而不会影响当前 Java进程。
为了对自身应用新的限制,Java 进程应该在它自己的上下文中调用 setrlimit
函数。由于此函数没有 Java 包装器,因此只能通过本机接口调用:JNI、JNA 或 JNR。
但是,如果 Java 在非特权用户下运行,则更新文件限制 (ulimit -n
) 无论如何都是无用的,因为 HotSpot JVM 会自动将此限制更新为最大允许值 - 请参阅 this question .
我做了一个可行的解决方法。我正在使用执行 java 程序的 shell 脚本。因此,我在 shell 脚本执行 运行-the-java 部分之前设置了 ulimit。正如@apangin 所回答的,这设置了 shell 进程的 ulimit 和从这个 shell 进程产生的 java 进程,继承了这个 ulimit。