Batches überwachen und ggf. neustarten

komplexor

Mitglied
Hallo,

ich versuche mich gerade daran eine Art Batchmonitor zu schreiben. Dazu starte ich eine Batch mittels dem ProcessBuilder. Die Batch startet dann ein externes Modul und nach kurzer Zeit beendet es dieses dann wieder, das ganze in einer Endlosschleife, also starten, auflegen, starten, auflegen...... Das funktioniert soweit auch ganz gut, aber nun zu dem Problem: Es kommt vor dass das Modul nach dem Beenden einfach hängen bleibt und der Prozess bei "
Code:
Sending message to Modul,ACBX ... done"
einfach hängen bleibt und nicht wieder startet. Genau hier muß dann eingegriffen werden. Mein Monitor soll diesen Fall erkennen, den Prozess beenden und wieder neu starten. Leider habe ich keine Ahnung wie ich das realisieren kann, jmd eine Idee?
Hier mal der aktuelle Code:
Java:
public void run(){
		try {
			ProcessBuilder processBuilder = new ProcessBuilder("cmd", "/c", "MyWindowsDOSBatch.bat");
			System.out.println("MyWindowsDOSBatch.bat gestartet");
			 processBuilder.directory(new File("C:\\"));
			 final Process process = processBuilder.start();
			 ExecutorService executorService = Executors.newSingleThreadExecutor();
			 executorService.execute(new Runnable() {
			   public void run() {
			     Scanner scanner = new Scanner(process.getInputStream());
			     String line;
			     long start;
			     long end;
			     while (scanner.hasNext()) {
			       line = scanner.nextLine();
			       System.out.println(line);
			     }
			     scanner.close();
			   }
			 });
  
			 System.out.println(process.waitFor());
			 executorService.shutdown();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
 
Ich glaube im "execute" Block kannst du es nicht machen (ungeprüfte Aussage)

ganz spontane Idee dazu:
du startest einen extra Thread, der periodisch prüft, ob dein Prozess noch läuft
a. läuft er länger als X Sekunden, bricht der Thread den Prozess ab
b. Ist der Prozess schneller zu ende, beendet er den Thread,

Nach Beendigung deines Threads kannst du den Prozess neu starten, da Prozess und Thread beendet sind.
 
Zuletzt bearbeitet:
hallo,

danke für die antwort, aber so funktioniert das nicht, da der Prozess ja weiterhin ausgeführt wird, aber an einer bestimmten position hängt. Was ich brauche ist zwischen
Java:
while (scanner.hasNext()) {
                   line = scanner.nextLine();
                   System.out.println(line);
}
ein timer der prüft ob nach bestimmter zeit eine neue Zeile geschrieben wurde, wenn nicht, dann beende den prozess. Aber ich weiß nicht wie ich das überprüfen kann.
 
danke für die antwort, aber so funktioniert das nicht, da der Prozess ja weiterhin ausgeführt wird

Ja, genau deswegen nehme einen weiteren Thread, der nach einem eingestellten timeout deinen Prozess killt. Dazu benötigst du einen Merker, der kennzeichnet, ob dein Prozess noch läuft und über den frägst du ab, ob er gekillt werden soll:
Pseudocode:
Java:
public void run(){
	// 100x100 ms = 10 s Timeoutzeit
	for(int i = 0; i < 100; i++){
		if(!processRunning)
			return;
		Thread.sleep(100);
   }
   if(processRunning)
		process.kill();
}
 
Ich sehe gerade, dass nicht dein Batch File immer wieder neu gestartet wird, sondern in deinem Batch File wird immer wieder irgendwas ausgeführt.

OK, aber mein Beispiel lässt sich auch auf die 2 Zeilen anwenden, die du genannt hast. vor nextLine Startest du den TimeoutThread und danach beendest du ihn wieder. Sollte dein Process hängen, so bricht der TimeoutThread den Process ab. Von aussen kannst du dann per Schleife den Process neu starten, wenn er durch den TimeoutThread abgewürgt wurde. Wenn der Process regulär beendet wird, so verlässt du die Schleife einfach.
 
Zuletzt bearbeitet:
hey freeze,

genau so versuch ich das gerade...leider klappt es noch nicht...
ich bastel noch ein wenig und wenn nichts klappt...werd ich nochmal posten.
danke soweit schon mal.
 

Zurück
Oben