Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cannot get the getInputStream from Runtime.getRunTime.exec()

public class LinuxInteractor {

public static String executeCommand(String command)
{
System.out.println("Linux command: " + command);

try 
{
   Process  p = Runtime.getRuntime().exec(command);
   p.waitFor();
   BufferedReader bf=new BufferedReader(new InputStreamReader( p.getInputStream()));
   String str=bf.readLine();
   System.out.println("inputStream is::"+str);
   while( (str=bf.readLine()) != null)
   {
       System.out.println("input stream is::"+str);        
   }
   System.out.println("process started");
}
catch (Exception e) {
System.out.println("Error occured while executing Linux command. Error       Description: "
    + e.getMessage());
    e.printStackTrace();
}
}

When I run the script through console, it's working. But through Java program InputStream(Str) is coming as null.

Is there any other approach I can use?

like image 670
SachG Avatar asked Jan 13 '23 04:01

SachG


1 Answers

Solution
You should try to do the reading and the executing on different threads.

A better alternative is to use a ProcessBuilder, which takes care of the "dirty" work for you.
The code inside the try block could look something like this:

/* Create the ProcessBuilder */
ProcessBuilder pb = new ProcessBuilder(commandArr);
pb.redirectErrorStream(true);

/* Start the process */
Process proc = pb.start();
System.out.println("Process started !");

/* Read the process's output */
String line;             
BufferedReader in = new BufferedReader(new InputStreamReader(
        proc.getInputStream()));             
while ((line = in.readLine()) != null) {
    System.out.println(line);
}

/* Clean-up */
proc.destroy();
System.out.println("Process ended !");

See, also, this short demo.


Cause of the problem
According to the Java Docs, waitFor():

causes the current thread to wait, if necessary, until the process represented by this Process object has terminated.

So, you are trying to get the process's output-stream after it has terminated, therefore the null.


(Sorry for the major revamp of the answer.)

like image 75
gkalpak Avatar answered Jan 28 '23 22:01

gkalpak