Runtime.exec() => java.io.exception: too many open files

Status
Nicht offen für weitere Antworten.

michah

Mitglied
Nach einigen hundert Aufrufen mit Runtime.exec() bekomme ich folgende Exception:
java.IO.Exception: Too many open files
Ich weis dass der Fehler an den Stream-handels liegt, bzw. dass nicht alle geschlossen
werden, nur weis ich nicht welche Handels noch offen sind (siehe Klasse unten).
Kann mir jemand helfen.

Gruss und Merci
Micha Haeusermann

Code:
import java.io.*;

public class Execute {
    // Init
    static int exitcode = 0;
    static String errorout = "";
    static String runout = "";
    static boolean error = false;

    public static boolean runCommand(String command) {

        //Log.write("class Execute: call shell command: " + command);
        try {
            // create Runtimeobject rt
            Runtime rt = Runtime.getRuntime();
            // create Processobject pr
            Process pr = rt.exec(command);
            // wait until process is done
            pr.waitFor();
            // check for errors
            exitcode = pr.exitValue();
            // create process error reader
            BufferedReader perror = new BufferedReader(new InputStreamReader(pr.getErrorStream()));
            // create process output reader
            BufferedReader poutput = new BufferedReader(new InputStreamReader(pr.getInputStream()));
            // write error to log
            if (exitcode != 0) {
                //Log.write("Error: class Execute: exit code: " + exitcode);
                while ((errorout = perror.readLine()) != null) {
                    //Log.write("Error: class Execute: " + errorout);
                }
                error = true;
            }
            else {
                //Log.write("class Execute: Done, exit code: " + exitcode);
            }
            // write output to runout (only first line)
            runout = poutput.readLine();
            if (runout == null) {
                runout = "";
            }
       // destroy not longer used instances
            pr.getErrorStream().close();
            pr.getInputStream().close();
            pr.getOutputStream().close();
       poutput.close();
       perror.close();
            pr.destroy();
        }
        // catch exceptions and write it to log
        catch (Exception e) {
            error = true;
            //Log.write("Error: class Execute: exception: " + e.toString());
        }
   // return true if an error occurred
        return error;
    }
}
 

Bleiglanz

Gesperrter Benutzer
Wenn dein Code eine Exception auslöst, werden nicht alle Streams geschlossen!

Füg eine finallly Klausel hinzu, in der du nochmal alle schliesst,

Code:
foo.close(); // könnte ja selbst eine Exception werfen
foo = null;
bar.close(); // wenn bei foo geworfen, komm ich nicht hierher !!!!!
bar = null;
catch(Exception e){} // ist mir hier egal
finally
{
if(null!=foo) { foo.close(); // wirft vielleicht wieder, nochmal wrappen
if(null!=bar) { bar.close(); // evenso 
}

Editiert von P3AC3MAK3R: Code-Tags repariert
 

michah

Mitglied
Leider bringt das mit der finally-Klausel nichts, da bereits die Streams (siehe Zeile 44 - 46) geschlossen sind.
 

Bleiglanz

Gesperrter Benutzer
doch:

wenn irgendwo im try - block eine Exception fliegt, dann werden die close-Methoden nicht mehr aufgerufen (weil 44-46 dann gar nicht erreicht wird!)
 

michah

Mitglied
Ja das stimmt, nur fliegt erst eine Exception nach einigen hundert Aufrufen -> erst sobald keine Filehandels mehr
vorhanden sind. Also muss doch das Problem darin liegen, dass irgendwo noch ein Streamhandel offen bleibt und
dies immer wieder bei jedem Aufruf der Methode bis keine mehr zur verfügung stehen.

Als Beispiel wenn ich ein Kommando wie dieses "cp /.../filexy /.../" 1000 mal sequentiell ausführen muss, wird nach
ca. 300 Aufrufen die beschriebe Exception geworfen, obwohl ich bei jedem einzelne Prozess warte bis dieser be-
endet ist und versuche alle Streamhandels zu schliessen.
Würde ein Streamhandel nicht geschlossen, müsste ja auch eine Exception geworfen werden, oder sehe ich dies
falsch?
 
G

Guest

Gast
Um zum einen den normalen Output des Programmes zu lesen (pr.getInputStream siehe Zeile 24) und die Fehlerausgaben zu lesen (pr.getErrorSream siehe Zeile 26) (wenn ich dem Programm etwas mitteilen wollte, würde ich pr.getOutputStream() verwenden).

Kenne eigentlich nur diese Variante um schlau mit einem Prozess zu komonizieren und das funktioniert normalerweise auch ohne
Probleme.
 

Bleiglanz

Gesperrter Benutzer
ich meinte die Zeilen zum schliessen 44-45, vielleicht ist ja das mehrfache abholen des Streams ein problem:

pr.getErrorStream().close();
 
G

Guest

Gast
Das Verhalten ändert auch nicht wenn ich die Zeilen 44 & 45 entferne (46 brauche ich, da sonst der OutputStream nicht geschlossen wird).
 
G

Guest

Gast
Einfachste und unsaubere Lösung:

- mit ulimit -a die max Anzahl der offenen Files ermitteln
- mit ulimit -n diesen Wert erhöhen
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Registry Autostart Eintrag ertstellen mit Java (Runtime.getRuntime().exec()) Allgemeine Java-Themen 0
G Runtime.exec beendet Programm unter Linux, wenn Java Programm beendet wird Allgemeine Java-Themen 3
M Runtime.exec() verursacht auf manchen Systemen Probleme - Ursache unklar Allgemeine Java-Themen 2
S Command funktioniert in Kommandzeile aber nicht mit ProcessBuilder bzw. Runtime.exec auf MAC Allgemeine Java-Themen 3
Thallius Runtime.getRuntime().exec " escapen? Allgemeine Java-Themen 9
N Runtime.getRuntime().exec Problem mit find Allgemeine Java-Themen 3
T Bluescreen bei Runtime.exec(); Allgemeine Java-Themen 8
I Runtime.getRuntime().exec Problem Allgemeine Java-Themen 4
N Runtime.exec() Exception Problem Allgemeine Java-Themen 3
N Runtime.exec() Allgemeine Java-Themen 7
truesoul Runtime.getRuntime().exec nebenbei ausführen Allgemeine Java-Themen 12
Z Runtime.getRuntime().exec-Problem Allgemeine Java-Themen 4
J Runtime.exec setzt Fokus auf Frame Allgemeine Java-Themen 2
V Probleme mit Runtime.exec() Allgemeine Java-Themen 3
M Runtime.exec() - Performance / Frage zu Threads Allgemeine Java-Themen 5
M Runtime.getRuntime().exec(cmd); auf windows ... Allgemeine Java-Themen 2
T Runtime.exec() Allgemeine Java-Themen 3
X Wann ist Runtime.getRuntime().exec mit Copy fertig? Allgemeine Java-Themen 10
G Output eines über Runtime.getRuntime.exec gestarteten Jars Allgemeine Java-Themen 6
N runtime.exec() Problem Allgemeine Java-Themen 6
W Runtime.getRuntime().exec() Allgemeine Java-Themen 10
lordcarlos Runtime exec und mplayer (linux) Allgemeine Java-Themen 11
C JApplet und Runtime.getRuntime().exec() Allgemeine Java-Themen 2
K Runtime.exec mit Timeout Allgemeine Java-Themen 5
0 Runtime.exec() VLC starten klappt nicht Allgemeine Java-Themen 9
G Runtime.exec - Prozess "mittendrin" "einfach Allgemeine Java-Themen 4
J Runtime.exec unter win vista? Allgemeine Java-Themen 10
M Probleme Runtime.getRuntime().exec(Start.cmd); Allgemeine Java-Themen 10
F Problem mit Runtime.exec() Allgemeine Java-Themen 8
M Runtime.exec unter Vista (Administrator Rechte) Allgemeine Java-Themen 2
K Probleme mit Runtime.getRuntime().exec Allgemeine Java-Themen 6
A Runtime.getRuntime().exec mit Warte auf Beendigung - Wie? Allgemeine Java-Themen 7
R Problem mit Runtime.getRuntime().exec() Allgemeine Java-Themen 4
the[V]oid Ausführen von "javac" über Runtime.exec() Allgemeine Java-Themen 4
F Runtime.getRuntime().exec mit Linux und Leerzeichen Allgemeine Java-Themen 3
D runtime.exec --> Prozess hängt sich auf Allgemeine Java-Themen 7
T Runtime.exec -> Prozesskontrolle abgeben ? Allgemeine Java-Themen 11
B Probleme mit Runtime.getRuntime().exec("cmd.exe") Allgemeine Java-Themen 4
M Runtime.getRuntime().exec(txt_rsync_option.getText()); Allgemeine Java-Themen 12
M Rückgabewert von Runtime.getRuntime().exec() Allgemeine Java-Themen 2
S Runtime.exec() berechtigungen Allgemeine Java-Themen 5
S Runtime.exec und X Umgebung Allgemeine Java-Themen 2
F Shell-Programme per Runtime.exec() starten und mehr? Allgemeine Java-Themen 4
K Runtime.exec und DFÜ-Verbindung Allgemeine Java-Themen 5
P Copy mit Runtime.exec() unter Unix Allgemeine Java-Themen 4
D Problem mit Runtime.getRuntime().exec() Allgemeine Java-Themen 14
L Runtime.getRuntime.exec() Allgemeine Java-Themen 7
T Probleme mit Runtime.exec in Jar File Allgemeine Java-Themen 2
M Runtime.exec unter Linux Allgemeine Java-Themen 11
X Problem mit Runtime.getRuntime().exec("cls"); Allgemeine Java-Themen 18
S Runtime.getRunTime().exec("jar cvf .) hängt sich auf Allgemeine Java-Themen 3
M Runtime.getRuntime().exec() - Fehler abfangen Allgemeine Java-Themen 5
S Runtime exec unter MacOS X will nicht "open pfad" Allgemeine Java-Themen 7
S dvbscan mit Runtime.getInstance().exec() ausführen ? Allgemeine Java-Themen 24
B Problem mit Runtime.getRuntime().exec() Allgemeine Java-Themen 4
G Runtime.getRuntime().exec("cmd /c START") Allgemeine Java-Themen 3
M this application requires a java runtime environment 1.8.0 Allgemeine Java-Themen 2
S Gibt es eine Moeglichkeit die Runtime Ausführung zu analysieren..? Allgemeine Java-Themen 7
J Verschiedene Runtime Versionen gleichzeitig? Allgemeine Java-Themen 12
K Threads Runtime und Process Probleme Allgemeine Java-Themen 3
H Runtime reagiert erst wenn Programm abbricht Allgemeine Java-Themen 1
J Probleme mit der Java-Runtime Allgemeine Java-Themen 10
D Java Objekt als Service in Runtime registrieren Allgemeine Java-Themen 1
W Threads Mit Thread und Runtime externe Programme öffnen Allgemeine Java-Themen 0
C Runtime Problem Allgemeine Java-Themen 1
P programm öffnen mit der runtime Allgemeine Java-Themen 9
W JavaDoc Runtime-Exceptions: Wie sinnvoll anzeigen? Allgemeine Java-Themen 14
P Runtime bzw. RAM-Auslastung eines Prozesses Allgemeine Java-Themen 9
M Befehl in Runtime ausführen der Eingabe benötigt Allgemeine Java-Themen 3
aze Jar ausführen über Runtime.execute funktioniert nicht Allgemeine Java-Themen 4
S Runtime Exceptions in eine Datei schreiben Allgemeine Java-Themen 7
N Internet Explorer mit bestimter Java Runtime starten Allgemeine Java-Themen 2
S Runtime.getRuntime()... Allgemeine Java-Themen 6
S Rückgabewert runtime Allgemeine Java-Themen 11
martin82 Java Runtime Update >17 - SwingWorker Änderungen? Allgemeine Java-Themen 7
W java ohne runtime Allgemeine Java-Themen 2
G Runtime? Allgemeine Java-Themen 3
S Problem mit Runtime. Allgemeine Java-Themen 2
E Programm mit der Runtime ausführen Allgemeine Java-Themen 8
M Runtime & Exception Allgemeine Java-Themen 3
J ServiceInterface - Runtime() > jemand eine idee? Allgemeine Java-Themen 2
A Runtime oder ProcessBuilder exe starten Allgemeine Java-Themen 3
V Java-Programm vom USB-Stick ohne Runtime-Installation Allgemeine Java-Themen 18
W In Runtime Output schreiben Allgemeine Java-Themen 5
J Probiert mal bitte aus (Thread + Runtime) Allgemeine Java-Themen 10
A Installierte Runtime ermitteln Allgemeine Java-Themen 3
T ausführbares jar File mit integriertem Java Runtime 6+JOGL Allgemeine Java-Themen 7
W Runtime Error216 Runtime error 217 Allgemeine Java-Themen 6
B Runtime Verzeichniss wechseln Allgemeine Java-Themen 8
C Java SE Runtime 6 Update 1 - IE 7 und FF 2.0 - Allgemeine Java-Themen 6
G Programm wird von java cmd runtime nicht aufgerufen? Allgemeine Java-Themen 13
A Runtime Process bricht nicht ab! Allgemeine Java-Themen 7
C Rechte unter WinXP, MySQL-Server per Runtime herunterfahren? Allgemeine Java-Themen 6
G Java Runtime Verzeichnis ermitteln Allgemeine Java-Themen 3
9 J2SE Runtime Environment 5.0 Allgemeine Java-Themen 6
G Runtime.getRuntime() Allgemeine Java-Themen 10
S Programm starten mit Runtime aktuelles Verzeichnis wechseln Allgemeine Java-Themen 7
M exec() funktioniert nicht Allgemeine Java-Themen 1
R Exec. Jar läd Bilder nicht! Allgemeine Java-Themen 5
S exec( "cmd /c") aber Konsole soll offen bleiben Allgemeine Java-Themen 9

Ähnliche Java Themen

Neue Themen


Oben