收集Linux命令输出

我现在在一台linux机器上。 我有一个Java程序,可以运行一些Linux命令,例如pstoplistfree -m

在Java中运行命令的方式如下所示:

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

我怎么能通过Java程序收集输出? 我需要处理输出中的数据。

Solutions Collecting From Web of "收集Linux命令输出"

使用Process.getInputStream()来获取表示新创建进程的stdout的InputStream

请注意,从Java开始/运行外部进程可能非常棘手,并且有很多缺陷。

他们在这篇优秀的文章中被描述, 这篇文章也描述了他们的方法。

要收集输出,你可以做类似的事情

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

这将运行您的脚本,然后从脚本收集输出到一个变量。 Joachim Sauer的答案中的链接还有其他的例子。

至于某些命令需要等一会,添加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(); } 

调用一个外部过程的技术性是相当重要的。 jproc库通过自动消费命令的输出并以字符串形式提供结果来帮助对这些内容进行抽象。 上面的例子是这样写的:

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

它还允许设置一个超时,以便您的应用程序不被没有终止的外部命令阻塞。