Собирать вывод команды Linux
Теперь я на Linux-машине. У меня есть программа Java, которая будет запускать некоторую команду linux, например ps
, top
, list
или free -m
.
Способ запуска команды в Java выглядит следующим образом:
Process p = Runtime.getRuntime().exec("free -m");
Как я могу собрать вывод с помощью программы Java? Мне нужно обработать данные на выходе.
Ответы
Ответ 1
Используйте Process.getInputStream()
, чтобы получить InputStream
, который представляет собой стандартный вывод вновь созданного процесса.
Обратите внимание, что запуск/запуск внешних процессов с Java может быть очень сложным и имеет довольно много ошибок.
Они описаны в этой замечательной статье, в которой также описываются пути вокруг них.
Ответ 2
Чтобы собрать результат, вы можете сделать что-то вроде
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);
Это запустит ваш script, а затем соберет вывод из script в переменную. У ссылки в комментарии Йоахима Зауэра есть дополнительные примеры этого.
Ответ 3
Как для некоторой команды нужно подождать некоторое время, добавьте 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();
}
Ответ 4
В частности, задействованы технические возможности вызова внешнего процесса. Библиотека jproc помогает абстрагироваться от них, автоматически потребляя результат команды и предоставляя результат в виде строки. Пример выше будет написан следующим образом:
String result = ProcBuilder.run("free", "-m");
Он также позволяет установить тайм-аут, чтобы ваше приложение не блокировалось внешней командой, которая не заканчивается.