Prozesssteuerung - Speicherhungrige externe Programme werden blockiert

CTOPO

Neues Mitglied
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:
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:

Network

Top Contributor
Du bekommst keine Fehlermeldung zurück, da du vergessen hast den ErrorStream von cmd.exe (Das Programm für .bat-Dateien) auszulesen. Was gleichzeitig auch der Grund ist, weshalb das Programm stehen bleibt.
Im Moment liest du nur den InputStream, wenn jedoch ein Fehler auftritt und dieses Ereigniss nicht von irgendetwas behandelt wird (übergeordnetes Programm) bleibt das Programm solange stehen.

Hier ein kleines Codebeispiel, sollte so funktionieren.
Java:
new Thread(new Runnable() {
@Override public void run() {startReader( process.getErrorStream() );
}}).start();

new Thread(new Runnable() {
@Override public void run() {startReader( process.getInputStream() );
}}).start();

process.waitFor();

Java:
private void startReader( InputStream s ) {
BufferedReader reader = new BufferedReader(new InputStreamReader(s));
try {
String line = reader.readLine();
while (line != null) {
System.out.println(line);
line = reader.readLine();
}
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
 

CTOPO

Neues Mitglied
Vielen Dank, das ist wirklich die Lösung!

Ich bin fälschlicherweise davon ausgegangen, dass es mit dem ErrorStream nicht zu tun haben kann, weil keine Fehler gemeldet werden, wenn ich die Batchdatei manuell ausführe und alles reibungslos ausgeführt wird. Allerdings kommt über den ErrorStream sehr wohl etwas, nämlich Warnungen und Anmerkungen des Programms.

Interessant ist, dass bei einer Veränderung der Problemgröße das externe Programm an einer ganz anderen Stelle gestoppt wird und bis dahin definitiv über den ErrorStream schon etwas gekommen ist. Somit scheint es eine gewisse "Toleranz" für nicht abgefangene Fehlermeldungen zu geben.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
X Java gewerblich nutzen mit externe Bibliothek. Was zu beachten? Allgemeine Java-Themen 18
OSchriever Externe Anwendung beenden Allgemeine Java-Themen 41
T Externe Java Klasen zur Laufzeit einbinden Allgemeine Java-Themen 10
J File in Package erstellen & lesen mit Programmstart in externe Projekt Allgemeine Java-Themen 3
X Threads Externe Variablen in Run Methoden verändern Allgemeine Java-Themen 4
V JTable Externe Lib Allgemeine Java-Themen 2
JavaWolf165 Externe .jar-Dateien in .jar-Datei intigrieren Allgemeine Java-Themen 0
Neumi5694 Externe Skripte Allgemeine Java-Themen 9
L JavaFX JavafX externe FXML laden? Allgemeine Java-Themen 4
S Externe Eclipse Projekte dynamisch einbinden Allgemeine Java-Themen 3
Thallius Externe .jar dynamisch einbinden Allgemeine Java-Themen 5
W Threads Mit Thread und Runtime externe Programme öffnen Allgemeine Java-Themen 0
M Externe Jar sehr langsam Allgemeine Java-Themen 23
F externe module. geht das in Java? Allgemeine Java-Themen 3
G Eclipse Wie mit Ant build.xml externe Jar´s einbinden? Allgemeine Java-Themen 5
M Wie externe System-Ressourcen zwangsweise freigeben Allgemeine Java-Themen 2
B Externe Programme und ProcessBuilder Allgemeine Java-Themen 5
nrg Externe Library Lizenzen Allgemeine Java-Themen 14
D externe programme / Jdesktoppane, ... Allgemeine Java-Themen 6
U Externe Logiken möglich? Allgemeine Java-Themen 8
G externe Properties datei aus Jar File heraus lesen Allgemeine Java-Themen 12
G externe Steuerung von Sprachsoftware Allgemeine Java-Themen 3
C Externe Bilder in Java-Applet blocken? Allgemeine Java-Themen 2
B Eclipse externe Dateien mit einbinden Allgemeine Java-Themen 10
H externe JARs in eigenem Programm-Jar einbinden. Allgemeine Java-Themen 5
N externe Anwendung aktivieren (nicht starten!) Allgemeine Java-Themen 3
H Externe Prozesse und Inputstreams - ausgabe in JTextArea Allgemeine Java-Themen 3
oliver1974 Zugriff auf externe .class Dateien (und resourcen) aus JAR Allgemeine Java-Themen 11
G externe package Allgemeine Java-Themen 7
E externe Anwendung aufrufen und sich selbst beenden Allgemeine Java-Themen 8
W Java und externe Anwendungen Allgemeine Java-Themen 3
J Externe File Emails für JavaMail Allgemeine Java-Themen 4
J Externe .jar bibis in programm .jar einbinden? Allgemeine Java-Themen 9
R externe Libraries in jar-file Allgemeine Java-Themen 16
R Kontrolle über Externe Prozess Allgemeine Java-Themen 5
O Externe Jars in eigene JAr packen in Eclipse Allgemeine Java-Themen 5
M Standardpfad für externe Dateien? Allgemeine Java-Themen 2
R aus Jar auf externe XML-Datei zugreifen Allgemeine Java-Themen 14
I externe Namensliste auslesen Allgemeine Java-Themen 13
M Java2exe Externe Packages einbinden! .JAR und sowas Allgemeine Java-Themen 7
thE_29 Externe (unbekannte) Klasse nutzen Allgemeine Java-Themen 11
J Externe Ansteuerung (Motor,Licht) mit Java? Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben