DIVA
DIVA

Reputation: 579

Process hanging on the process builder

I am working on java process builder to execute the windows external process(i.e., exe files). I have to get the process info and error using input stream, error stream to write it in some text files.

It's working sometimes and unexpectedly hanging sometimes.

When i invoke around three external process to execute one by one. Two process working and it's getting hang on third process only.

I could see the process exit value as 0 some times it's giving some other random value.

I have read the below blog and applied the same logic to execute the process but's not working for my scenarios.

Could anybody please help me to diagnose these problem...

//Starts to initiate the external process //This code will pick three arguments from to execute the process sequentially //it will pass the process commands through for loop one by one

 Process p =new ProcessBuilder(s)
               .directory(new File(je.getExecution().getWorkingDirectory()))
               .redirectErrorStream(true)
               .redirectOutput(file)
               .start();

p.getOutputStream().close();
int processStatus= p.waitFor();

// if the process exits with 0 normal termination

Thanks in advance..,

Upvotes: 2

Views: 2294

Answers (1)

Holger
Holger

Reputation: 298153

The entire thing you are doing is error prone and it’s not worth trying to find out all of the mistakes, as you are making your life unnecessarily hard.

Note that you are calling redirectErrorStream(true), but still are trying to read from the error stream, which makes no sense. The error stream will always be empty under this condition. That said, if you already know about redirections, it’s not clear, why you don’t use them directly, instead of creating threads, manually copying data into StringWriters, etc.

Apparently, you want to use the working directory je.getExecution().getWorkingDirectory(), launch the command s and directing both, output and error, of the program to file. This can be achieved as easy as

new ProcessBuilder(s)
    .directory(je.getExecution().getWorkingDirectory())
    .redirectErrorStream(true).redirectOutput(file)
    .start()
    .waitFor();

The only remaining error source is that the launched process could wait for input from your side. Since you apparently don’t want to provide input, you can use

Process proc = new ProcessBuilder(s)
    .directory(je.getExecution().getWorkingDirectory())
    .redirectErrorStream(true).redirectOutput(file)
    .start();
proc.getOutputStream().close();
proc.waitFor();

to denote that you won’t write any data. This will not stop the process, but when it tries to read something from its standard input, it will immediately get an end-of-file without blocking.

Which can be demonstrated with

Process proc = new ProcessBuilder("cmd", "/c", "pause")
    .redirectErrorStream(true).redirectOutput(file)
    .start();
proc.getOutputStream().close();
proc.waitFor();

Upvotes: 2

Related Questions