如何从java程序在终端运行命令?
我需要从JAVA程序在Fedora16的终端运行一个命令。我试着用如何从java程序在终端运行命令?,java,linux,terminal,Java,Linux,Terminal,我需要从JAVA程序在Fedora16的终端运行一个命令。我试着用 Runtime.getRuntime().exec("xterm"); 但这只是打开终端,我无法执行任何命令 我也试过: OutputStream out = null; Process proc = new ProcessBuilder("xterm").start(); out = proc.getOutputStream(); out.write("any command".getBytes()); out.f
Runtime.getRuntime().exec("xterm");
但这只是打开终端,我无法执行任何命令
我也试过:
OutputStream out = null;
Process proc = new ProcessBuilder("xterm").start();
out = proc.getOutputStream();
out.write("any command".getBytes());
out.flush();
但我仍然只能打开终端,但无法运行命令。
关于如何操作有什么想法吗?您需要使用
bash
可执行文件运行它,如下所示:
Runtime.getRuntime().exec("/bin/bash -c your_command");
更新:
根据建议,建议改为使用:
您实际上不需要从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”,因为大多数应用程序都会使用它来标识单个命令输入的结尾。正如其他人所说,您可以在不使用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();
我投票支持卡尔蒂克的答案。运行命令不需要打开终端 比如说,
// 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
我不知道为什么,但出于某种原因,“/bin/bash”版本不适合我。 相反,按照给出的示例,更简单的版本可以工作
我知道这个问题已经很老了,但是这里有一个封装ProcessBuilderAPI的方法。您是否尝试过
Runtime.getRuntime().exec()
您不需要打开xterm
,这就是打开终端的原因。您应该尝试sh-s
,您可以使用编写的代码,shell将接受来自流的命令,或者sh-c
,并且将运行参数中指定的命令。Runtime.exec()的用法现在不鼓励使用
:应改用ProcessBuilder()使用Runtime.exec()现在不鼓励使用:应改用ProcessBuilder()在中编辑的ProcessBuilder变量。文档中的注释提到ProcessBuilder更倾向于使用“修改的环境”启动流程,但在本例中不使用。无论如何,我的答案的主要补充是包含了如何在xterm中运行命令。但是如果命令执行的结果是冗长的日志,那么这个readLine东西根本不起作用,如何读取它呢?@YashAgrawal你能提供生成冗长日志的命令(或类似的命令)吗,所以我可以再次测试这个程序吗?我不能在这里发布它,因为在为ex:/hadoop…/bin/hdfs jar some.jar/input运行hadoop命令时,它的日志非常长/output@YashAgrawal我只是碰巧遇到了一个问题,这个问题基本上可以处理相同的情况。我想您可能也想检查一下,您能看看它是否有用吗?可执行文件可能采用的任何命令行参数(如果有的话)。
$ 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
String[] args = new String[] {"ping", "www.google.com"};
Process proc = new ProcessBuilder(args).start();