Hallo Liebe Forenmitglieder,
ich möchte mit einem JAVA Programm ein anderes Programm starten, welches wiederum andere Prozesse startet. Da das ganze leider recht komplex ist, habe ich versucht mein Problem auf ein einfaches Beispiel herunterzubrechen., Mit diesem Beispiel ist das Problem auf meinem System reproduzierbar.
Die Main-Methode beinhaltet:
Die Batch-Datei test.bat sieht folgendermaßen aus:
for /L %%N IN (1, 1, 20000) DO echo Nummer %%N > finished.txt
Die Batchdatei zählt also von 1 bis 200000 hoch und schreibt den aktuellen Wert in eine Textdatei. Das alles funktioniert reibungslos, wenn ich die Datei manuell ausführe. Starte ich sie aber über JAVA, kommt die Berechnung exakt bis 96. JAVA läuft die ganze Zeit über weiter und nichts passiert mehr.
waitFor() lässt in diesem Fall also nicht JAVA auf den aufgerufenen Prozess warten, sondern es hält den aufgerufenen Prozess an. Bei Tests mit anderen Programmen konnte ich sogar beobachten, dass nach dem manuellen Beenden von JAVA der Prozess auf den gewartet werden sollte wieder weiterlief.
Hat jemand eine Lösung hierfür? Ich habe nun bereits über vier Stunden in verschiedensten Foren gesucht, aber bisher keine Lösung gefunden.
Vielen Dank im Voraus.
EDIT:
Vielleicht sollte ich mein eigentliches Problem doch noch einmal beschreiben, weil das oben genannte Beispiel mein Problem doch nicht 100%ig widergibt. Mit meinem JAVA Programm steuere ich mehrere kommerzielle Programmsysteme an, auf deren Quellcode ich auch keinen Zugriff habe
Das mache ich beispielsweise so:
Das ganze funktioniert auch wunderbar mit mehreren Programm. Es funktioniert allerdíngs nicht mit einem Programm, welches sehr viel Rechenleistung und auch Arbeitsspeicher benötigt. Das Programm startet, läuft mehrere Minuten und stoppt dann plötzlich. In der Ausgabe ist keine Fehlermeldung und kein Hinweis auf ein Problem feststellbar. Sobald ich JAVA aber manuell und gewaltsam beende, läuft das Programm wieder weiter.
Könnte es vielleicht daran liegen, dass nach überschreiten einer gewissen Speichermenge das Programm einfach eingefroren wird? Was man dagegen machen?
ich möchte mit einem JAVA Programm ein anderes Programm starten, welches wiederum andere Prozesse startet. Da das ganze leider recht komplex ist, habe ich versucht mein Problem auf ein einfaches Beispiel herunterzubrechen., Mit diesem Beispiel ist das Problem auf meinem System reproduzierbar.
Die Main-Methode beinhaltet:
Java:
try
{
Process p = new ProcessBuilder("test.bat").start();
p.waitFor();
}
catch (IOException e)
{
e.printStackTrace();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
Die Batch-Datei test.bat sieht folgendermaßen aus:
for /L %%N IN (1, 1, 20000) DO echo Nummer %%N > finished.txt
Die Batchdatei zählt also von 1 bis 200000 hoch und schreibt den aktuellen Wert in eine Textdatei. Das alles funktioniert reibungslos, wenn ich die Datei manuell ausführe. Starte ich sie aber über JAVA, kommt die Berechnung exakt bis 96. JAVA läuft die ganze Zeit über weiter und nichts passiert mehr.
waitFor() lässt in diesem Fall also nicht JAVA auf den aufgerufenen Prozess warten, sondern es hält den aufgerufenen Prozess an. Bei Tests mit anderen Programmen konnte ich sogar beobachten, dass nach dem manuellen Beenden von JAVA der Prozess auf den gewartet werden sollte wieder weiterlief.
Hat jemand eine Lösung hierfür? Ich habe nun bereits über vier Stunden in verschiedensten Foren gesucht, aber bisher keine Lösung gefunden.
Vielen Dank im Voraus.
EDIT:
Vielleicht sollte ich mein eigentliches Problem doch noch einmal beschreiben, weil das oben genannte Beispiel mein Problem doch nicht 100%ig widergibt. Mit meinem JAVA Programm steuere ich mehrere kommerzielle Programmsysteme an, auf deren Quellcode ich auch keinen Zugriff habe
Das mache ich beispielsweise so:
Java:
public void startHyperMeshOSWindows()
{
// Ermittlung des Pfades der Startdatei für HyperMesh.
File hyperMeshBatch = new File(workingDir.getAbsolutePath() + seperator + "HyperMesh_data" + seperator + "HyperMesh_batch.bat");
// Ermittlung des Verzeichnisses, in welchem HyperMesh ausgeführt
// werden soll.
File hyperMeshExec = hyperMeshBatch.getParentFile();
// Start von HyperMesh in dem Verzeichnis HyperMesh_data.
Runtime rtm;
Process proc;
rtm = Runtime.getRuntime();
try {
proc = rtm.exec(hyperMeshBatch.getAbsolutePath(), null , hyperMeshExec);
BufferedReader input = new BufferedReader(new InputStreamReader(proc.getInputStream()));
// Die folgenden Zeilen dienen der Visualisierung der
// Programmausführung. Ohne diese würde alles im Hintergrund
// laufen und nicht einmal eine Konsole würde sich öffen.
String line ="";
while ((line = input.readLine()) != null)
System.out.println(line);
// Durch dieses Kommando wartet JAVA, bis der gestartete Prozess
// beendet ist.
proc.waitFor();
}
catch (IOException e)
{
e.printStackTrace();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
Das ganze funktioniert auch wunderbar mit mehreren Programm. Es funktioniert allerdíngs nicht mit einem Programm, welches sehr viel Rechenleistung und auch Arbeitsspeicher benötigt. Das Programm startet, läuft mehrere Minuten und stoppt dann plötzlich. In der Ausgabe ist keine Fehlermeldung und kein Hinweis auf ein Problem feststellbar. Sobald ich JAVA aber manuell und gewaltsam beende, läuft das Programm wieder weiter.
Könnte es vielleicht daran liegen, dass nach überschreiten einer gewissen Speichermenge das Programm einfach eingefroren wird? Was man dagegen machen?
Zuletzt bearbeitet: