java runtime exec 运行挂起的问题

我写了一个简单的oracle的备份系统,需要调用expdp和impdp命令。结果发现

int exitCode = Runtime.getRuntime().exec(cmd).waitFor();
if(0 == exitCode){
    // success
}else{
    //failure
}

 这样书写代码之后,晚上执行几千个表的备份的时候,有个数不定的expdp或impdp进程被挂死,不退出。

后来我发现很多人都遇到了类似的问题。解决方法如下:

 

http://blog.csdn.net/rogerjava/article/details/7006987

http://dhruba.name/2012/10/16/java-pitfall-how-to-prevent-runtime-getruntime-exec-from-hanging/

 

  1. public class TESTRuntime {  
  2.       
  3.     public String cmdexeStr = "exp test/test file=d:/daochu.dmp tables=(t_test)";  
  4.       
  5.     public String startRunTime(){  
  6.         try {  
  7.             Process proc = Runtime.getRuntime().exec(cmdexeStr);  
  8.             InputStream errorProcStream = proc.getErrorStream();  
  9.             InputStream outputProcStream = proc.getInputStream();  
  10.             InputStreamReader errorRead = new InputStreamReader(errorProcStream);  
  11.             InputStreamReader outputRead = new InputStreamReader(outputProcStream);  
  12.             BufferedReader errorbr = new BufferedReader(errorRead);  
  13.             String errorline = null;  
  14.                while ((errorline = errorbr.readLine()) != null) {  
  15.                    System.out.println("------error:/n"+errorline);  
  16.                }  
  17.             BufferedReader outputbr = new BufferedReader(outputRead);  
  18.             String outputline = null;  
  19.                while ((outputline = outputbr.readLine()) != null) {  
  20.                    System.out.println("------debug:/n"+outputline);  
  21.                }  
  22.             int num = proc.waitFor();  
  23.             System.out.println("------num:"+num);                          
  24.                         proc.destroy();   
  25.                      } catch (Exception e) {  
  26.             // TODO Auto-generated catch block  
  27.             e.printStackTrace();  
  28.         }  
  29.         return null;  
  30.     }  
  31.       
  32.     public static void main(String[] args) {   
  33.         System.out.println("------------start run--------------");  
  34.         TESTRuntime test = new TESTRuntime();  
  35.         test.startRunTime();  
  36.         System.out.println("------------end run--------------");  
  37.     }  
  38.   
  39. }  

你可能感兴趣的:(Runtime)