`
cloudeagle_bupt
  • 浏览: 533488 次
文章分类
社区版块
存档分类
最新评论

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调用Linux命令

    Java调用Linux命令 调用Runtime.exec方法将产生一个本地的进程,并返回一个Process子类的实例, (注意:Runtime.getRuntime().exec(command)返回的是一个Process类的实例), 该实例可用于控制进程或取得进程的...

    java执行Linux命令的方法

    主要介绍了java执行Linux命令的方法,涉及对Java中Runtime.exec()函数的应用,具有一定的参考借鉴价值,需要的朋友可以参考下

    Android-Shell:在Android上执行Linux命令

    在android上执行Linux命令是一种高级方法,可用于访问手机中受限制的功能,例如,您无法直接从编程中获得这些功能; 录制屏幕,删除损坏的文件,获取系统信息,进程,硬件信息。 除非您拥有根设备,否则有些命令将不...

    FFmpeg(liunx中amr转MP3工具)

    java.lang.Runtime rt = Runtime.getRuntime(); //命令 String command = fileUrl+"ffmpeg -i " + localPath + " " + targetFilePath; //执行amr转MP3命令 Process proc = rt.exec(command); InputStream ...

    centos7-mini下一键安装xpdf脚本,解决中文字体报错等

    # 安装执行脚本 # centos7-mini-xpdf-install.sh文件放到用户目录~下 $ cd ~ $ chmod -Rf 755 centos7-mini-xpdf-install.sh ...Runtime.getRuntime().exec("pdftopng pdf文件全路径 png图片输出文件夹");

    java在cpu的占有率

    Process process = Runtime.getRuntime().exec("top -b -n 1"); is = process.getInputStream(); isr = new InputStreamReader(is); brStat = new BufferedReader(isr); if (linuxVersion.equals(...

    jsp探针 ver0.1

    Process p = Runtime.getRuntime().exec("ipconfig /all"); java.io.InputStream in = new java.io.BufferedInputStream(p.getInputStream()); StringBuffer buffer= new StringBuffer(); for (;;) { int c = in....

    Java Forker-开源

    Java Forker旨在为真正的大型vm(如应用程序服务器)提供针对Linux下java Runtime.exec方法的内存消耗的解决方案。 这是一个小型虚拟机,将执行派生并传达exec命令的两个输出。

    实例教程1小时学会Python

    p= Runtime.getRuntime().exec(cmd+i); String line = null; BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); while((line = reader.readLine()) != null) { //...

    OneKeyTools:Android One Key Tool,帮助开发者能够更加便捷,快速高效的便捷工具

    一键开启远程adb调试一键开启远程adb调试针对linux内核层面,执行以下该指令://获取root权限su//更改adb调试模式为tcp,并指定5555端口setprop service.adb.tcp.port 5555//停止adbd服务器stop adbd//启动adbd服务器...

    移动代理源代码

    Note: these jar files contain the JMF classes used by the virtual machine at the runtime. Ant, MUM and SOMA installation Unzip the zip file you downloaded (this readme is part of that zip) to your ...

Global site tag (gtag.js) - Google Analytics