如何在java程序中调用linux命令或者shell脚本

来源:互联网 发布:m1头盔淘宝 编辑:程序博客网 时间:2024/05/19 06:48
在java程序中如何调用linux的命令?如何调用shell脚本呢?

这里不得不提到java的process类了。

process这个类是一个抽象类,封装了一个进程(你在调用linux的命令或者shell脚本就是为了执行一个在linux下执行的程序,所以应该使用process类)。process类提供了执行从进程输入,执行输出到进程,等待进程完成,检查进程的推出状态,以及shut down掉进程。

另外还要注意一个类:Runtime类,Runtime类是一个与JVM运行时环境有关的类,这个类是Singleton的。

这里用到的Runtime.getRuntime()方法是取得当前JVM的运行环境,也是java中唯一可以得到运行环境的方法。(另外,Runtime的大部分方法都是实例方法,也就是说每次运行调用的时候都需要调用到getRuntime方法)

下面说说Runtime的exec()方法,这里要注意的有一点,就是public Process exec(String [] cmdArray, String [] envp);这个方法中cmdArray是一个执行的命令和参数的字符串数组,数组的第一个元素是要执行的命令往后依次都是命令的参数,envp感觉应该和C中的execve中的环境变量是一样的,envp中使用的是name=value的方式。

下面说一下,如何使用process来调用shell脚本

例如,我需要在linux下实行linux命令:sh test.sh,下面就是执行test.sh命令的方法:

这个var参数就是日期这个201102包的名字。

    String shpath="/test/test.sh";   //程序路径

    Process process =null;

    String command1 = “chmod 777 ” + shpath;
    process = Runtime.getRuntime().exec(command1);
    process.waitFor();




    String var="201102";               //参数

    String command2 = “/bin/sh ” + shpath + ” ” + var; 
    Runtime.getRuntime().exec(command2).waitFor();

注意:

1

我为什么要使用 chmod 777命令呢?在有的机器上面,可能没有设置权限问题。这是你在linux下面执行shell脚本需要注意的问题。没有的话,就需要添加权限,就用chmod 777,否则在执行到Runtime.getRuntime().exec的时侯会出现Permission denied错误。

2

waitFor()这个也是必不可缺的,如果你需要执行多行命令的话,把waitFor()这个加上。


[plain] view plain copy
  1. package test;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.IOException;  
  5. import java.io.InputStreamReader;  
  6. import java.util.ArrayList;  
  7. import java.util.List;  
  8.   
  9. public class ReadCmdLine {  
  10.     public static void main(String args[]) {  
  11.         Process process = null;  
  12.         List<String> processList = new ArrayList<String>();  
  13.         try {  
  14.             process = Runtime.getRuntime().exec("ps -aux");  
  15.             BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream()));  
  16.             String line = "";  
  17.             while ((line = input.readLine()) != null) {  
  18.                 processList.add(line);  
  19.             }  
  20.             input.close();  
  21.         } catch (IOException e) {  
  22.             e.printStackTrace();  
  23.         }  
  24.   
  25.         for (String line : processList) {  
  26.             System.out.println(line);  
  27.         }  
  28.     }  
  29. }  

调用shell脚本,判断是否正常执行,如果正常结束,Process的waitFor()方法返回0

[java] view plain copy
  1. public static void callShell(String shellString) {  
  2.     try {  
  3.         Process process = Runtime.getRuntime().exec(shellString);  
  4.         int exitValue = process.waitFor();  
  5.         if (0 != exitValue) {  
  6.             log.error("call shell failed. error code is :" + exitValue);  
  7.         }  
  8.     } catch (Throwable e) {  
  9.         log.error("call shell failed. " + e);  
  10.     }  
  11. }  

原创粉丝点击