Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unable to read InputStream from Java Process (Runtime.getRuntime().exec() or ProcessBuilder)

I'm trying to start a process externally with Java and can't read anything from its InputStream.

If I'm starting a process with commands like "ls", "ps" or "kill" everything works fine. I can start the process and get information either on the InputStream or the ErrorStream of the Process.

If I try to use a command like "ftp" or "telnet" both InputStream and ErrorStream are blocking my program when trying to read. No information is passed through these streams at any time.

Can anyone explain the behavior? Is it just not possible with these commands or do I have an issue with my implementation?

     String processName = _configuration.getProgramCommand().getCommand();    ProcessBuilder procBuilder = new ProcessBuilder(processName);        System.out.println("Starting process "+processName);       _proc = Runtime.getRuntime().exec(processName);// procBuilder.start();                 if(!procBuilder.redirectErrorStream()) {         _errorWorker = new ProcessErrorWorker(_proc);     _errorWorker.start();       }     String proc_start_answer = _configuration.getNextCommand().getCommand();    System.out.println("Waiting for process answer '"+proc_start_answer+"'");    BufferedReader input = new BufferedReader(new InputStreamReader(_proc.getInputStream()));           String answer = "";       try {              System.out.println("inputstream ready: "+input.ready());     answer+=input.readLine();      System.out.println("process answer:  "+answer);     input.close();             } catch(Exception e) {     System.out.print(e.getMessage());         }  
like image 694
mgratzer Avatar asked Jul 01 '10 16:07

mgratzer


2 Answers

I realize this is question is old, but I just experienced the same problem. In order to fix this I used this code..

 List<String> commandAndParameters = ...;  File dir = ...; // CWD for process   ProcessBuilder builder = new ProcessBuilder();  builder.redirectErrorStream(true); // This is the important part  builder.command(commandAndParameters);  builder.directory(dir);   Process process = builder.start();   InputStream is = process.getInputStream(); 

It appears the process is expecting you to also read from the Error stream. The best fix to this is to merge the input and error stream together.

Update

I didn't see that you attempted to read from the error stream also. It could just be that you need to merge them manually with redirectErrorStream(true)

like image 69
Andrew T Finnell Avatar answered Sep 22 '22 12:09

Andrew T Finnell


I had this issue with a C program printing to stdout...

The redirectErrorStream(true) solution with a fflush(stdout) in the C code did the trick for me.

like image 40
Pierre Brunetti Avatar answered Sep 25 '22 12:09

Pierre Brunetti