Runtime.exec mit Timeout

Status
Nicht offen für weitere Antworten.

Krabat

Bekanntes Mitglied
Ich habe eine Klasse geschrieben, die allgemein externe (native) Programme aufrufen kann, aber nach einem definierten Timeout abbrechen soll. Doch beim testen (in meinem Fall mit 7-zip) erzeugt 7-zip viel output auf der console und die Verarbeitung wird nicht beendet. Ich vermute der StdInput der Anwendung muss geleert werden, da dieser voll ist!? Denn wenn ich den StdInput auslese ("clearStream(...)") kommt dieser Fehler nicht mehr. Doch dafür funktioniert der Timer dann nicht mehr.

Anbei die Klasse:

Java:
package packager;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.TimeoutException;

/**
 *
 */
public class External2 {

	private String fullCommand = null;
	
	private long timeout = -1;
	
	private ByteArrayOutputStream stdOutStream = null;
	
	private ByteArrayOutputStream stdErrStream = null;
	
	
	
	public External2( String command, String arguments, long timeout ) {
		if( arguments!=null && !arguments.isEmpty() ) {
			fullCommand = command.trim() + " " + arguments.trim();
		} else {
			fullCommand = command.trim();
		}
		this.timeout = timeout;
		stdOutStream = new ByteArrayOutputStream();
		stdErrStream = new ByteArrayOutputStream();
	}
	
	public int execute() throws ExecuteException, TimeoutException {
		Timer timer = null;
		if( timeout>0 ) {
			System.out.println("[Timer] : " + timeout);
			timer = new Timer();
			timer.schedule( new InterruptTimer( Thread.currentThread() ), timeout );
		}
		Process process = null;
		try {
			process = Runtime.getRuntime().exec( fullCommand );
			//comment the next 2 clearStreams to make timeout work
			clearStream( process.getInputStream(), stdOutStream );
			clearStream( process.getErrorStream(), stdErrStream );
			process.waitFor();
			return process.exitValue();
			
		} catch( IOException e ) {
			throw new ExecuteException( e );
		} catch( InterruptedException e ) {
			process.destroy();
			throw new TimeoutException( e.getMessage() );
		} finally {
			if( timer != null ) {
				timer.cancel();
			}
		}
	}
	
	private void clearStream( InputStream inputStream, OutputStream outputStream ) {
		int i;
		try {
			while( (i = inputStream.read()) != -1 ) {
				outputStream.write(i);
			}
			outputStream.flush();
		} catch (IOException e) {//ignore
			return;
		}
	}
	
	private class InterruptTimer extends TimerTask {
		private Thread threadToInterrupt = null;
		public InterruptTimer( Thread threadToInterrupt) {
			this.threadToInterrupt = threadToInterrupt;
		}
		@Override
		public void run() {
			threadToInterrupt.interrupt();
		}
	}
}
 
Zuletzt bearbeitet:

Ebenius

Top Contributor
Wie wäre es, die Ströme in einem gesonderten Thread auszulesen? Zum Beispiel: [post=491950]OutputPipe[/post]

Ebenius
 

Krabat

Bekanntes Mitglied
Danke für den Link. Mit der OutputPipe funktioniert es einwandfrei. Nur ein Gedanke am Rande: Wenn der externe Prozess lange arbeitet ohne eine Ausgabe zu liefern und dann wieder beginnt neue Ausgaben zu schreiben, wurde dann in der Zwischenzeit der jeweilige OutputPipe Thread nicht bereits beendet?
 

Ebenius

Top Contributor
Danke für den Link. Mit der OutputPipe funktioniert es einwandfrei. Nur ein Gedanke am Rande: Wenn der externe Prozess lange arbeitet ohne eine Ausgabe zu liefern und dann wieder beginnt neue Ausgaben zu schreiben, wurde dann in der Zwischenzeit der jeweilige OutputPipe Thread nicht bereits beendet?
Nein. Die Ströme bleiben die ganze Zeit offen, es sei denn der Prozess schließt sie. Dann kann er selbst sie aber auch nie wieder öffnen.

Ebenius
 

Krabat

Bekanntes Mitglied
hmm... eigentlich meinte ich, dass der InputStream solange mit read() gelesen wird, bis dieser leer ist, dann wird "-1" zurück gegeben und der Thread wird beendet. Jedoch habe ich eben noch einmal in der InputStream.read() API nachgeschaut und die read Methode blockt, wenn derzeit keine weiteren Zeichen gelesen werden können. Ist damit also geklärt. Vielen Dank, Ebenius!
 
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
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
G Runtime.exec beendet Programm unter Linux, wenn Java Programm beendet wird Allgemeine Java-Themen 3
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
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 Runtime.exec() => java.io.exception: too many open files Allgemeine Java-Themen 10
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
W Aggregierter JaCoCo.exec erzeugen Allgemeine Java-Themen 0
M exec() funktioniert nicht Allgemeine Java-Themen 1
R Exec. Jar läd Bilder nicht! Allgemeine Java-Themen 5

Ähnliche Java Themen


Oben