在java中运行bash shell脚本
我想从我的程序中运行一个shell脚本,但似乎没有做任何事情。 我直接在linux终端运行相同的命令,它工作正常,所以我猜它是我的java代码。 正如您所看到的,我首先使用PrintWriter将命令写入shell脚本,但我希望这不会影响shell脚本本身的运行。 任何帮助,将不胜感激!
public static void main(String[] args) { // TODO Auto-generated method stub String nfdump = "nfdump -o csv -r /home/shane/Documents/nfdump/nfcapd.201211211526>blank.txt"; try { FileWriter fw = new FileWriter("/home/shane/Documents/script.sh"); PrintWriter pw = new PrintWriter(fw); pw.println("#!/bin/bash"); pw.println(nfdump); pw.close(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } Process proc = null; try { proc = Runtime.getRuntime().exec("sh /home/shane/Documents/script.sh"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }
您应该使用返回的Process
来获取结果。
Runtime#exec
作为单独的进程执行命令,并返回Process
类型的对象。 您应该调用Process#waitFor
以便程序等到新进程完成。 然后,您可以在返回的Process
对象上调用Process.html#getOutputStream()
以检查已执行命令的输出。
创建流程的另一种方法是使用ProcessBuilder
。
Process p = new ProcessBuilder("myCommand", "myArg").start();
使用ProcessBuilder
,您可以将命令的参数列为单独的参数。
请参阅ProcessBuilder和Runtime.exec()以及ProcessBuilder与Runtime.exec()之间的区别,以了解有关Runtime#exec
和ProcessBuilder#start
之间差异的更多信息。
试试这个,它会起作用。
String[] cmd = new String[]{"/bin/sh", "path/to/script.sh"}; Process pr = Runtime.getRuntime().exec(cmd);
从Java执行脚本时,它会生成一个未设置PATH环境变量的新shell。
使用以下代码设置PATH env变量应运行脚本。
String[] env = {"PATH=/bin:/usr/bin/"}; String cmd = "you complete shell command"; //eg test.sh -dparam1 -oout.txt Process process = Runtime.getRuntime().exec(cmd, env);
- 带有AOP拦截器的Spring 3 MVC @Controller?
- 为什么JDK1.8.0u121无法找到kerberos default_tkt_enctypes类型? (KrbException:default_tkt_enctypes没有支持的默认etypes)
- 在Oracle JDBC驱动程序中,将Java日期写入TIMESTAMP列时,时区会发生什么?
- java read write unicode / UTF-8 filenames(not contents)
- 从JavaScript调用后,Applet URLConnection.connect失败
- 使用base64图像的HTML到PDF会抛出FileNotFoundException
- 无法使用Selenium WebDriver和Java打开IE11驱动程序实例
- 在Java中停止线程?
- 如何从引用java项目访问静态资源(WEB-INF)文件夹中的文件?