电竞比分网-中国电竞赛事及体育赛事平台

分享

runtime.exec()執(zhí)行進(jìn)程block死鎖問(wèn)題 - fuliang - JavaEye技術(shù)網(wǎng)站

 ShangShujie 2010-04-15

最近在java代碼中使用runtime.exec執(zhí)行rsync命令做同步,發(fā)現(xiàn)當(dāng)兩個(gè)目錄需要非常大同步工作的時(shí)候,rsync進(jìn)程就 會(huì)一直阻塞。查看了jdk幫助,以及google都無(wú)果,于是打算把執(zhí)行的信息都log出來(lái),結(jié)果執(zhí)行突然成功。仔細(xì)思考,這個(gè)問(wèn)題應(yīng)該是進(jìn)程執(zhí)行命令的 時(shí)候,輸出結(jié)果有個(gè)buffer,如果buffer已經(jīng)滿了,而沒(méi)有進(jìn)程去讀,這個(gè)進(jìn)程就會(huì)阻塞等待,導(dǎo)致我前面的問(wèn)題出現(xiàn)。

效果可以通過(guò)如下代碼說(shuō)明:

Java代碼
  1. import java.io.*;  
  2.   
  3. public class Rsync{  
  4.     public static void main(String[] args) throws Exception{  
  5.         if(args.length != 2){  
  6.             System.out.println("Usage: java Rsync src des");  
  7.             return;  
  8.         }  
  9.         Process proc = Runtime.getRuntime().exec("rsync -v -r -e --progress ssh -t -C " + args[0] + " " + args[1]);  
  10.         System.out.println("Waiting for end...");  
  11.         BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));  
  12.         String line = null;  
  13.         while((line = br.readLine()) != null){  
  14.             System.out.println(line);  
  15.         }  
  16.         br.close();  
  17.                 int exitValue = 0;  
  18.         if((exitValue = proc.waitFor()) != 0){  
  19.             System.out.println("exitValue:" + exitValue);  
  20.         }  
  21.         System.out.println("rsync complete!");  
  22.     }  
  23. }  
 

如果注釋掉:

Java代碼
  1.     BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));  
  2. String line = null;  
  3. while((line = br.readLine()) != null){  
  4.     System.out.println(line);  
  5. }  
  6. br.close();  

 在兩個(gè)目錄需要大量的同步操作時(shí)就會(huì)一直blocked住。

所以如果你不需要執(zhí)行命令的輸出,最好直接將輸出重定向到 > /dev/nll

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多