2013-03-12 89 views
16

我需要从JAVA程序在Fedora 16的终端运行命令。我试过使用如何在java程序的终端运行命令?

Runtime.getRuntime().exec("xterm"); 

但这只是打开终端,我无法执行任何命令。

我也试过这样:

OutputStream out = null; 
Process proc = new ProcessBuilder("xterm").start(); 
out = proc.getOutputStream(); 
out.write("any command".getBytes()); 
out.flush(); 

但我仍然只能打开终端,但不能运行该命令。 任何想法如何做到这一点?

+1

您是否试过'Runtime.getRuntime()。exec(); '你不需要打开'xterm'这是打开你的终端的东西。 – 2013-03-12 08:29:39

+0

你应该试试'sh -s',你可以使用你编写的代码,shell将接受来自流的命令,或者'sh -c <你想运行的命令>',并且在论点将被运行。 – ppeterka 2013-03-12 08:30:23

回答

22

你需要使用bash可执行这样来运行它:

Runtime.getRuntime().exec("/bin/bash -c your_command"); 

更新: 正如xav建议,最好是使用ProcessBuilder代替:

String[] args = new String[] {"/bin/bash", "-c", "your_command", "with", "args"}; 
Process proc = new ProcessBuilder(args).start(); 
+2

现在不鼓励使用'Runtime.exec()':use应该使用ProcessBuilder来代替(http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html#exec%28java。 lang.String [],%20java.lang.String [],%20java.io.File%29) – xav 2015-10-16 13:38:43

+0

这并不适用于我。在下面检查我的答案。 – 2016-01-27 14:14:24

6

你不” t实际上需要从xterm会话运行命令,您可以直接运行它:

String[] arguments = new String[] {"/path/to/executable", "arg0", "arg1", "etc"}; 
Process proc = new ProcessBuilder(arguments).start(); 

如果进程交互响应输入流,并要注入的值,然后做你做了什么之前:

OutputStream out = proc.getOutputStream(); 
out.write("command\n"); 
out.flush(); 

不要在最后忘了“\ n”但正如大多数应用程序将使用它来识别单个命令输入的结尾。

4

正如其他人所说,你可以在没有xterm的情况下运行你的外部程序。但是,如果你想在终端窗口中运行,例如为了让用户与它交互,xterm允许你指定程序作为参数运行。

xterm -e any command 

在Java代码变为:

String[] command = { "xterm", "-e", "my", "command", "with", "parameters" }; 
Runtime.getRuntime().exec(command); 

或者,使用的ProcessBuilder:

String[] command = { "xterm", "-e", "my", "command", "with", "parameters" }; 
Process proc = new ProcessBuilder(command).start(); 
+0

现在不鼓励使用'Runtime.exec()':use应该使用ProcessBuilder来代替(http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html#exec%28java。 lang.String [],%20java.lang.String [],%20java.io.File%29) – xav 2015-10-16 13:40:52

+0

编辑过的ProcessBuilder变体。文档中的注释引用了ProcessBuilder优先于启动“已修改环境”的进程,在这种情况下不使用。无论如何,我的回答主要增加了如何在xterm中运行命令。 – user1252434 2015-10-16 13:53:51

11

我投KARTHIK T的答案。你不需要打开一个终端来运行命令。

例如,

// file: RunShellCommandFromJava.java 
import java.io.BufferedReader; 
import java.io.InputStreamReader; 

public class RunShellCommandFromJava { 

    public static void main(String[] args) { 

     String command = "ping -c 3 www.google.com"; 

     Process proc = Runtime.getRuntime().exec(command); 

     // Read the output 

     BufferedReader reader = 
       new BufferedReader(new InputStreamReader(proc.getInputStream())); 

     String line = ""; 
     while((line = reader.readLine()) != null) { 
      System.out.print(line + "\n"); 
     } 

     proc.waitFor(); 

    } 
} 

输出:

$ javac RunShellCommandFromJava.java 
$ java RunShellCommandFromJava 
PING http://google.com (123.125.81.12): 56 data bytes 
64 bytes from 123.125.81.12: icmp_seq=0 ttl=59 time=108.771 ms 
64 bytes from 123.125.81.12: icmp_seq=1 ttl=59 time=119.601 ms 
64 bytes from 123.125.81.12: icmp_seq=2 ttl=59 time=11.004 ms 

--- http://google.com ping statistics --- 
3 packets transmitted, 3 packets received, 0.0% packet loss 
round-trip min/avg/max/stddev = 11.004/79.792/119.601/48.841 ms 
+0

但如果命令执行的结果是冗长的日志,那么这readLine的东西根本不起作用,如何读取呢? – 2017-03-17 17:09:05

+0

@YashAgrawal你能提供生成冗长日志的命令(或类似的命令),所以我可以再次测试这个程序吗? – 2017-03-17 23:32:18

+0

我不能发布它在这里,因为它的一个非常长的日志,而运行hadoop命令为前:/hadoop.../bin/hdfs jar some.jar /输入/输出 – 2017-03-18 07:14:21

1

我不知道为什么,但出于某种原因, “/斌/庆典” 版本并没有对我的工作。 相反,简单的版本的工作,下面给出here at Oracle Docs.

String[] args = new String[] {"ping", "www.google.com"}; 
Process proc = new ProcessBuilder(args).start(); 
1

我知道这个问题是很老的例子,但这里有一个library封装了的ProcessBuilder的API。