Collect Linux command output

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/6441304/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-05 04:39:41  来源:igfitidea点击:

Collect Linux command output

javalinuxprocess

提问by user84592

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

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

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

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.

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

采纳答案by Joachim Sauer

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

Use Process.getInputStream()to get an InputStreamthat 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.

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.

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

回答by Nick DeFazio

To collect the output you could do something like

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.

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.

回答by Albert Chen

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

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();

    }

回答by Felix Leipold

The technicalities of calling an external process are quite involved. The jproclibrary 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:

The technicalities of calling an external process are quite involved. The jproclibrary 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");

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.

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

回答by Kailas Kakade

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

This functioin will give result of any linux command