Собрать вывод команды Linux - PullRequest
11 голосов
/ 22 июня 2011

Я сейчас на машине с Linux. У меня есть Java-программа, которая запускает некоторые команды linux, например ps, top, list или free -m.

Способ выполнения команды в Java следующий:

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

Как я могу собрать вывод с помощью Java-программы? Мне нужно обработать данные в выводе.

Ответы [ 5 ]

14 голосов
/ 22 июня 2011

Используйте Process.getInputStream(), чтобы получить InputStream, который представляет стандартный вывод вновь созданного процесса.

Обратите внимание, что запуск / запуск внешних процессов из Javaможет быть очень хитрым и иметь немало ловушек.

Они описаны в этой превосходной статье , в которой также описываются способы обхода.

6 голосов
/ 22 июня 2011

Чтобы собрать выходные данные, вы можете сделать что-то вроде

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

Это запустит ваш скрипт и затем соберет вывод из скрипта в переменную.Ссылка в ответе Йоахима Зауэра содержит дополнительные примеры этого.

0 голосов
/ 26 апреля 2018
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;

}

Эта функция даст результат любой команды linux

0 голосов
/ 28 февраля 2015

Технические аспекты вызова внешнего процесса довольно сложны. Библиотека jproc помогает абстрагироваться от них, автоматически используя выходные данные команды и предоставляя результат в виде строки. Пример выше будет написан так:

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

Это также позволяет установить тайм-аут, чтобы ваше приложение не блокировалось внешней командой, которая не завершается.

0 голосов
/ 13 января 2015

Поскольку некоторым командам нужно подождать некоторое время, добавьте p.waitFor (); при необходимости.

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

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...