为什么从JVM调用bash -c“ ulimit -Sn”会有不同的输出?

时间:2018-07-26 00:50:17

标签: java shell

该命令是“ ulimit -Sn”,以及调用它的Java代码,如下所示

Process process = Runtime.getRuntime().exec(new String[] { "bash", "-c", cmd });
process.waitFor();
BufferedReader outputReader = new BufferedReader(new InputStreamReader(process.getInputStream()));

String line = "";

while ((line = outputReader.readLine()) != null) {
    output.append(line + "\n");
}

System.out.println(output.toString());

我在shell中运行命令的结果是1024,但是在同一shell中运行java代码的结果是4096。为什么?

1 个答案:

答案 0 :(得分:0)

为不同的进程配置不同的ulimit是完全正常的;这与java或bash无关。

您正在要求为您的进程配置的打开文件描述符的最大数量的软限制。

再次:为您的流程配置。不同的进程可以配置不同的ulimit。

例如,如果其中之一是从systemd服务启动的,则LimitNOFILE=4096将提供一个新值。

如果其中之一是从调用ulimit命令的脚本启动的,则那个可以提供新值。

如果其中之一是由配置了PAM规则的用户帐户,服务或登录机制启动的,则也可以提供新的值。


顺便说一下,在Linux上,您可以通过读取文件/proc/self/limits以完全独立于语言的方式提取此值。通过用其他进程的PID代替self,您可以在不同进程之间进行读取和比较。