java使用Runtime.exec执行linux命令

转载 2013年12月03日 16:18:55

转自: http://huajianhsiu.iteye.com/blog/1772775


使用sh -c  , 不然会报 can not  create Process  error =2的错误!

一、Runtime.getRuntime().exec()执行命令情况: 
       Runtime.getRuntime().exec("cmd /c your command")//2000 
       Runtime.getRuntime().exec("command /c your command")//98 
       Runtime.getRuntime().exec("sh/ your command")//linux 

二、执行.sh文件的情况: 
      1、把命令写成a.sh ;执行命令的时候 
           Process child = Runtime.getRuntime().exec("bash a.sh,null,new File("//usr/local/mysql/bin/")); 
           child.waitFor(); 
           ........ 
       2、Process child = Runtime.getRuntime(). 

                                          exec(new String[] {"/bin/sh","-c","mysqldump -u root -p7788919 axtic_cg" }, 

                                                   null, 
                                                   new File("/usr/local/mysql/bin/")); 
            child.waitFor(); 

            注:waitFor()等待操作完成 



Java具有使用Runtime.exec对本地程序调用进行重定向的能力,但是用重定向或者管道进行命令调用将会出错。解决这一问题的办法是通过命令shell运行命令。在Java中调用本地程序会破坏平台独立性规则,但是经常需要这么做才行。 
   
  以下是一个简单类的范例,展示了在Unix下运行ls命令的情形: 
   
  

Java代码  收藏代码
  1. import java.io.BufferedInputStream;   
  2.   import java.io.IOException;   
  3.      
  4.   public class ExecLs {   
  5.      
  6.    static public void main(String[] args) {   
  7.    String cmd = "ls"   
  8.      
  9.    try {   
  10.    Process ps = Runtime.getRuntime().exec(cmds);   
  11.    System.out.print(loadStream(ps.getInputStream()));   
  12.    System.err.print(loadStream(ps.getErrorStream()));   
  13.    } catch(IOException ioe) {   
  14.    ioe.printStackTrace();   
  15.    }   
  16.    }   
  17.      
  18.    // read an input-stream into a String   
  19.    static String loadStream(InputStream in) throws IOException {   
  20.    int ptr = 0;   
  21.    in = new BufferedInputStream(in);   
  22.    StringBuffer buffer = new StringBuffer();   
  23.    while( (ptr = in.read()) != -1 ) {   
  24.    buffer.append((char)ptr);   
  25.    }   
  26.    return buffer.toString();   
  27.      
  28.      
  29.      
  30.      
  31.      
  32.    }   
  33.      
  34.   }   
   
  上述代码中重要的部分是exec方法和命令字符串ls。本程序将输出运行目录下的列表细节。 
   
  那么,如果你想重定向这些细节内容到文件该怎么办?这一命令行的输入应该写成ls > FILE,但是当你将cmd变量改变成这样的话,运行就会出错,如下: 
   
  /bin/ls: >: No such file or directory 
  /bin/ls: FILE: No such file or directory 
   
  出错的原因在于额外的参数被直接传送到了ls命令而不是送到实际的命令行。解决这一问题的办法是将cmd串弄成一个字符串数组,并且将你想运行的程序传送到命令shell。 
   
  因此,将cmd行改成下面的样子: 
   
   String[] cmd = { "sh", "-c", "ls > FILE" }; 
   
  你将得到一个名为FILE的文件,里面是目录列表。-c参数是告诉它读取随后的字符串,而最后的参数是你要运行的脚本。 
   
  在这种情况下,管道也运行良好,所以你可以把命令改成下面的方式: 
   
  String[] cmd = { "/bin/sh", "-c", "/bin/ls | grep d > FILE" }; 
   
  这种形式将给你一个名为FILE的文件,里面是ls条目中包含d的条目。给出sh和ls的全路径有利于提供你的程序的安全性。 
   
  虽然使用Runtime.exec不是创建独立于平台的Java的最佳方式,但是有些时候是必要的。使用这种重定向技术有助于走出Runtime.exec的限制。 

说明: 
Java代码  收藏代码
  1. 1.     exec的必须是可执行的程序,如果是命令行的命令则还需另外处理   
  2. 2.     在windows中process = runtime.exec(new String[] { "cmd.exe","/C""dir"});   
  3. 3.     在linux中process = runtime.exec(new String[] { "/bin/sh","-c""echo $PATH"});  

举报

相关文章推荐

java使用Runtime.exec执行linux命令

Java使用Runtime.exec具有对本地程序调用进行重定向的能力,但是用重定向或者管道进行命令调用将会出错。解决这一问题的办法是通过命令shell运行命令。在Java中调用本地程序会破坏平台独立...
  • rzhzhz
  • rzhzhz
  • 2012-05-08 17:14
  • 13087

java runtime.exec常见问题

Java中Runtime.exec的一些事 博客分类:  Java基础库   0 预备知识 1 不正确的调用exitValue 2不正确的调用waitFor 3 一种可接受的...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

shell脚本以及java调用shell并传参

在者就是java中怎样调用shell脚本 及怎样给shell传参 网上找到好几种写法(实质都是Runtime.getRuntime().exec();方法不同重载形式):' v- a9 g, r/...

Android Runtime.getRuntime().exec() 使用方法

Android 可以通过Runtime.getRuntime().exec()方法来执行命令或者创建进程。 1. Runtime.getRuntime().exec共有六个重载方法: publi...

通过Runtime.getRuntime().exec使用Linux脚本

很多时候开发者非常方便地在shell命令窗口使用的命令行进行一些查看操作文件操作修改权限等,也希望能够在程序中直接使用相关的命令直接操作系统; 于是Java提供了一个这样的接口RunTime; R...

关于java Runtime.getRunTime.exec(String command)的使用

关于java Runtime.getRunTime.exec(String command)的使用 当要调用一个外部程序的时候,java提供了exec方法,具体用法是:Runtime.g...

Java调用Linux下的shell命令并将结果以流的形式返回

这篇文章写,Java调用 Linux的shell命令 并将结果以流的形式返回。 下面直接上代码,代码都是打了注释的。 十分浅显易懂。 import java.io.Buffere...

java使用Runtime.getRuntime来执行python脚本

这个是自己做项目的一个需求,之前使用jython来在java中调用python脚本,但是当python引入的第三方的类库之后,jython中是不存在这种包的 就会造成的结果是,不能使用 impo...

Android: 通过Runtime.getRuntime().exec调用底层Linux下的程序或脚本

Android Runtime使得直接调用底层Linux下的可执行程序或脚本成为可能比如Linux下写个测试工具,直接编译后apk中通过Runtime来调用或者写个脚本,apk中直接调用,省去中间层或...

C程序调用shell脚本共有三种方式:system()、popen()、exec系列函数

1)system(shell命令或shell脚本路径);          执行过程:system()会调用fork()产生子进程,由子进程来调用/bin/sh-c string来执行参数stri...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)