Process starten – Fallen umgehen

20. September 2007 von Jan Lolling in Allgemein
Schlagwörter: ,

Java Thema 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” ;-)

3 Responses to “Process starten – Fallen umgehen

  1. Codeman Says:

    Setzt Du eine solche Lösung auch in einem Produktivsystem ein?

  2. Jan Says:

    ja das ist keine Hobby-Entwicklung. Sollte ich aus der Formulierung deiner Frage mögliche Probleme herrauslesen ?

  3. Jan Says:

    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.