gpt4 book ai didi

java - 从 linux 中的 jvm 中查找硬和软打开文件限制(ulimit -n 和 ulimit -Hn)

转载 作者:太空狗 更新时间:2023-10-29 11:05:25 27 4
gpt4 key购买 nike

我有一个问题,我需要从 java/groovy 程序中找出 linux 进程的硬和软打开文件限制。当我从终端执行 ulimit 时,它会为硬打开文件限制和软打开文件限制提供单独的值。

$ ulimit -n
1024
$ ulimit -Hn
4096

但是,如果我在 groovy 中执行它,它会忽略软限制并始终返回硬限制值。

groovy> ['bash', '-c', 'ulimit -n'].execute().text  
Result: 4096

groovy> ['bash', '-c', 'ulimit -Hn'].execute().text
Result: 4096

如果我遗漏了什么,请告诉我。我使用 ubuntu 12.04,Groovy 版本:1.8.4 JVM:1.6.0_29 执行此操作。

更新:我在 Java 中尝试过同样的事情。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringWriter;
import java.io.Writer;

public class LinuxInteractor {
public static int executeCommand(String command, boolean waitForResponse, OutputHandler handler) {
int shellExitStatus = -1;
ProcessBuilder pb = new ProcessBuilder("bash", "-c", command);
pb.redirectErrorStream(true);
try {
Process shell = pb.start();

if (waitForResponse) {

// To capture output from the shell
InputStream shellIn = shell.getInputStream();

// Wait for the shell to finish and get the return code
shellExitStatus = shell.waitFor();

convertStreamToStr(shellIn, handler);
shellIn.close();
}
}

catch (IOException e) {
System.out
.println("Error occured while executing Linux command. Error Description: "
+ e.getMessage());
}
catch (InterruptedException e) {
System.out
.println("Error occured while executing Linux command. Error Description: "
+ e.getMessage());
}
return shellExitStatus;
}

public static String convertStreamToStr(InputStream is, OutputHandler handler) throws IOException {

if (is != null) {
Writer writer = new StringWriter();

char[] buffer = new char[1024];
try {
Reader reader = new BufferedReader(new InputStreamReader(is,
"UTF-8"));
int n;
while ((n = reader.read(buffer)) != -1) {
String output = new String(buffer, 0, n);
writer.write(buffer, 0, n);

if(handler != null)
handler.execute(output);
}
} finally {
is.close();
}
return writer.toString();
} else {
return "";
}
}

public abstract static class OutputHandler {
public abstract void execute(String str);
}

public static void main(String[] args) {
OutputHandler handler = new OutputHandler() {
@Override
public void execute(String str) {
System.out.println(str);
}
};

System.out.print("ulimit -n : ");
LinuxInteractor.executeCommand("ulimit -n", true, handler);
System.out.print("ulimit -Hn : ");
LinuxInteractor.executeCommand("ulimit -Hn", true, handler);
}

}

这个程序的输出:

$ java LinuxInteractor 
ulimit -n : 4096

ulimit -Hn : 4096

为什么在 Java 中行为相同。 java是否有机会设置ulimit。提前致谢。

最佳答案

Groovy 在其启动脚本中将此限制设置为最大值。

startGroovy:160 中:

# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query businessSystem maximum file
descriptor limit: $MAX_FD_LIMIT"
fi
fi

事实证明 jvm 自己设置了这个限制。我不确定为什么 groovy 也在改变它。尝试:

java -XX:-MaxFDLimit LinuxInteractor

它将禁用此行为。

关于java - 从 linux 中的 jvm 中查找硬和软打开文件限制(ulimit -n 和 ulimit -Hn),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10877271/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com