java使用Runtime.exec执行linux命令

转自: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. importjava.io.BufferedInputStream;
  2.   importjava.io.IOException;
  3.   
  4.   publicclassExecLs{
  5.   
  6.   staticpublicvoidmain(String[]args){
  7.   Stringcmd="ls"
  8.   
  9.   try{
  10.   Processps=Runtime.getRuntime().exec(cmds);
  11.   System.out.print(loadStream(ps.getInputStream()));
  12.   System.err.print(loadStream(ps.getErrorStream()));
  13.   }catch(IOExceptionioe){
  14.   ioe.printStackTrace();
  15.   }
  16.   }
  17.   
  18.   //readaninput-streamintoaString
  19.   staticStringloadStream(InputStreamin)throwsIOException{
  20.   intptr=0;
  21.   in=newBufferedInputStream(in);
  22.   StringBufferbuffer=newStringBuffer();
  23.   while((ptr=in.read())!=-1){
  24.   buffer.append((char)ptr);
  25.   }
  26.   returnbuffer.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(newString[]{"cmd.exe","/C","dir"});
  3. 3.在linux中process=runtime.exec(newString[]{"/bin/sh","-c","echo$PATH"});

你可能感兴趣的:(java使用Runtime.exec执行linux命令)