Process starten – Fallen umgehen
20. September 2007 von Jan Lolling in Allgemein
Schlagwörter: Berlin, Java
Will man einen Commando auf OS Ebene starten macht man das so…
Process process = Runtime.getRuntime().exec(command);
Das allein reicht nicht aus ! Das Problem besteht darin, dass das zu startende Programm ggf. eine Ausgabe auf die Standardausgabekanäle machen möchte und wenn es das nicht kann dann hängt es. Abhängig von der Plattform kann es dann zum sofortigen oder verzögerten Stillstand kommen.
Man umgeht das in dem man die Ausgabekanäle während der Laufzeit des Prozesses ausliest (z.B. und auf die Konsole ausgibt).
Da beide Kanäle abgefragt werden müssen macht man das am besten in zwei separaten Threads, die gleich nach dem exec-Befehl die Input- und Error-Streams erhalten und deren Ergebnis lesen (was man mit dem Ergebnis macht spielt keine Rolle, hauptsache dem gestarteten Prozess “hört jemand zu”.
new StreamReaderThread(process.getErrorStream()).start(); // in dem Thread den InputStream (Error) des Process lesen
new StreamReaderThread(process.getInputStream()).start(); // in dem Thread den InputStream (Standard) des Process lesen
Nach diese Threads gestartet sind kann man getrost auf das Ende des gestarteten Befehls warten mit:
int exitCode = process.waitFor();
Heute erste wieder “gelernt”
September 21st, 2007 at 10:04
Setzt Du eine solche Lösung auch in einem Produktivsystem ein?
September 21st, 2007 at 19:16
ja das ist keine Hobby-Entwicklung. Sollte ich aus der Formulierung deiner Frage mögliche Probleme herrauslesen ?
September 21st, 2007 at 20:44
Wenn die Gefahr besteht muss man eine parallen Prozess starten, der als watchdog funktioniert und dann dem wartenden Thread (durch waitFor() angehaltenen Thread) den interrupt-Befehl zu senden. Das kann entweder ein Timeout sein oder der “Arbeiter” muss regelmässig ein Lebenszeichen geben.