我有一个问题,我需要从java / groovy程序中找出linux中进程的软硬件打开文件限制。 当我从terminal执行ulimit时,会为软打开的文件限制提供单独的值。
$ ulimit -n 1024 $ ulimit -Hn 4096
但是,如果我常规执行它,它会忽略软限制并始终返回硬限制值。
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
它将禁用此行为。