Programm startet sich selbst neu, alte Logfiles bleiben gesperrt

Also ich hab ein etwas aussergewöhnliches Problem. Ich habe einen Java Prozess der sich nach einer gewissen Anzahl Durchgänge neu starten soll und seine Consolenausgaben in .txt Datein umleitet. Bei jedem Start werden zwei neue Files (Für Output und Error Stream) angelegt und der alte Prozess beendet sich mit System.exit(0) selbst. Dennoch bleiben alle Logfiles gesperrt solange immer wieder ein Nachfolgeprozess läuft. Dieses Problem besteht nur unter Windows unter Unix funktioniert das Verfahren.

Um das ganze etwas zu Veranschaulichen:

Nach X-Durchgängen starte ich mein Programm auf diese weise neu:
Java:
Date date = new Date(System.currentTimeMillis());
String LOGFILEPFAD = "C:\\Logfiles\\";

Runtime.getRuntime().exec("cmd /c java -jar C:\\meinProgramm.jar -Xmx1024M 1>" + LOGFILEPFAD + new SimpleDateFormat("yyyy.dd.MM-HH.mm.ss").format(date) + "log.txt" + " 2>" + LOGFILEPFAD + new SimpleDateFormat("yyyy.dd.MM-HH.mm.ss").format(date) + "err.txt");

System.exit(0)

Nun legt der neue Prozess zwei neue Files an und schreibt seine Consolenausgaben in diese. Die alten Files der vorherigen Prozesse bleiben aber gesperrt und können nicht gelöscht oder verschoben werden. Wie gesagt das Problem besteht nur unter Windows.

MfG MasterChristian
 
Weil du es eigentlich falsch anstellst. Der "neue Prozess" darf nicht Kindprozess des noch laufenden sein.
Denn die JVM muss
  • entweder den Elternprozess so lange stoppen (und nicht beenden), wie noch ein Kindprozess läuft (so scheint es die Win-JVM korrekt zu machen),
  • oder den Kindprozess mitsamt dem Elternprozess killen.
Bei Linux scheinst du Glück zu haben, dass der Kindprozess noch einen Moment weiterlaufen darf - oder hast ihn (ausversehen) so gestartet, dass er nicht als Kindprozess läuft.

Ich denke mal, dass du auch für alle Files, Reader/Writer usw. immer schön .close() aufrufst, damit sie auch geschlossen sein können, wenn der Elternprozess noch (halb) lebt...
 
Zuletzt bearbeitet:
Hab nun eine Lösung gefunden:

Ich leite die Streams am anfang der Main in die Files um:
Java:
	private void initLogfiles() {
		Date date = new Date(System.currentTimeMillis());
		String logString = LOGFILEPFAD + new SimpleDateFormat("yyyy.dd.MM-HH.mm.ss").format(date) + "log.txt";
		String errString = LOGFILEPFAD + new SimpleDateFormat("yyyy.dd.MM-HH.mm.ss").format(date) + "err.txt";
		
		try {
			PrintStream out = new PrintStream(new FileOutputStream(logString));
			System.setOut(out);
			PrintStream err = new PrintStream(new FileOutputStream(errString));
			System.setErr(err);
		} 
		catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}

Dann starte ich das Programm auf diese weise neu:
Java:
Runtime.getRuntime().exec("cmd /c java -jar C:\\meinProgramm.jar -Xmx1024M");
System.out.close();
System.err.close();
System.exit(0);

Ob das System.out.close() überhaubt nötig ist hab ich jetzt noch nicht getestet.

MfG MasterChristian
 

Zurück
Oben