user84592
user84592

Reputation: 4882

Collect Linux command output

I am now on a linux machine. I have a Java program which would run some linux command, for example ps, top, list or free -m.

The way to run a command in Java is as follows:

Process p = Runtime.getRuntime().exec("free -m");

How could I collect the output by Java program? I need to process the data in the output.

Upvotes: 14

Views: 25357

Answers (5)

Joachim Sauer
Joachim Sauer

Reputation: 308269

Use Process.getInputStream() to get an InputStream that represents the stdout of the newly created process.

Note that starting/running external processes from Java can be very tricky and has quite a few pitfalls.

They are described in this excellent article, which also describes ways around them.

Upvotes: 14

Kailas Kakade
Kailas Kakade

Reputation: 53

public String RunLinuxGrepCommand(String command) {
    String line = null;
    String strstatus = "";
    try {

        String[] cmd = { "/bin/sh", "-c", command };
        Process p = Runtime.getRuntime().exec(cmd);
        BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
        while ((line = in.readLine()) != null) {
            strstatus = line;
        }
        in.close();
    } catch (Exception e) {

        StringWriter sw = new StringWriter();
        PrintWriter pw = new PrintWriter(sw);
        e.printStackTrace(pw);
        pw.flush();
        String stackTrace = sw.toString();
        int lenoferrorstr = stackTrace.length();
        if (lenoferrorstr > 500) {
            strstatus = "Error:" + stackTrace.substring(0, 500);
        } else {
            strstatus = "Error:" + stackTrace.substring(0, lenoferrorstr - 1);

        }
    }
    return strstatus;

}

This functioin will give result of any linux command

Upvotes: 1

Felix Leipold
Felix Leipold

Reputation: 1113

The technicalities of calling an external process are quite involved. The jproc library helps abstracting over these by automatically consuming the output of the command and providing the result as a string. The example above would be written like this:

String result = ProcBuilder.run("free", "-m");

It also allows to set a timeout, so that your application isn't blocked by an external command that is not terminating.

Upvotes: 1

Albert Chen
Albert Chen

Reputation: 1401

As for some command need to wait for a while, add p.waitFor(); if necessary.

public static void main(String[] args) {

        CommandLineHelper obj = new CommandLineHelper();
        String domainName = "google.com";
        //in mac oxs
        String command = "ping -c 3 " + domainName;
        String output = obj.executeCommand(command);
        System.out.println(output);

    }

private String executeCommand(String command) {

        StringBuffer output = new StringBuffer();

        Process p;
        try {

            p = Runtime.getRuntime().exec(command);

            p.waitFor();
            BufferedReader reader = 
                            new BufferedReader(new InputStreamReader(p.getInputStream()));

                        String line = "";           
            while ((line = reader.readLine())!= null) {
                output.append(line + "\n");
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

        return output.toString();

    }

Upvotes: 1

Nick DeFazio
Nick DeFazio

Reputation: 2432

To collect the output you could do something like

 Process p = Runtime.getRuntime().exec("my terminal command");

  p.waitFor();
  BufferedReader buf = new BufferedReader(new InputStreamReader(
          p.getInputStream()));
  String line = "";
  String output = "";

  while ((line = buf.readLine()) != null) {
    output += line + "\n";
  }

  System.out.println(output);

This would run your script and then collect the output from the script into a variable. The link in Joachim Sauer's answer has additional examples of doing this.

Upvotes: 6

Related Questions