Feststellen von Beschränkungen für offene und weiche Dateien in jvm unter Linux (ulimit -n und ulimit -Hn)

Ich habe ein Problem, bei dem ich in einem Java / Groovy-Programm die Grenzwerte für das Öffnen von Dateien unter Linux herausfinden muss. Wenn ich ulimit vom Terminal aus ausführe, werden separate Werte für die Grenzwerte für geöffnete und nicht geöffnete Dateien angegeben.

$ ulimit -n
1024
$ ulimit -Hn
4096

Wenn ich es jedoch in Groovy ausführe, ignoriert es die weiche Grenze und gibt immer einen harten Grenzwert zurück.

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

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

Bitte lassen Sie mich wissen, wenn ich etwas vermisse. Ich habe Ubuntu 12.04, Groovy Version: 1.8.4 JVM: 1.6.0_29 für diese Ausführung verwendet.

Aktualisieren: Ich habe dasselbe in Java versucht.

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);
    }

}

Ausgabe für dieses Programm:

$ java LinuxInteractor 
ulimit -n : 4096

ulimit -Hn : 4096

Warum ist das Verhalten in Java gleich? Ist Java-Einstellung ulimit zufällig. Danke im Voraus.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage