2010-08-06 11 views
1

이 발생합니다. 따라서 Java 파일에서 많은 양의 출력을 생성하는 셸 스크립트를 실행하려고합니다. 이 프로세스가 중단되고 완료되지 않습니다.java에서 쉘 스크립트를 호출하면

그러나 쉘 스크립트 내에서 스크립트의 출력을 일부 로그 파일 또는/dev/null Java 파일로 재지 정하여 jiffy로 실행하고 완료합니다.

Java 프로그램이 완료하지 못하는 데이터 량 때문입니까? 그렇다면 어떤 문서가 있습니까? 또는 (문서화 된) 데이터의 양에 제한이 있습니까?

다음은이 시나리오를 시뮬레이션하는 방법입니다. 권리를

#!/bin/sh 
# Toggle the line below 
exec 3>&1 > /dev/null 2>&1 

count=1 
while [ $count -le 1000 ] 
do 
     cat some-big-file 
     ((count++)) 
done 

echo 
echo Yes I m done 

무료 맥주 :

import java.io.InputStream; 

public class LotOfOutput { 

    public static void main(String[] args) { 
     String cmd = "sh a-script-which-outputs-huuggee-data.sh"; 
     try { 
      ProcessBuilder pb = new ProcessBuilder("bash", "-c", cmd); 
      pb.redirectErrorStream(true); 
      Process shell = pb.start(); 
      InputStream shellIn = shell.getInputStream(); 
      int shellExitStatus = shell.waitFor(); 
      System.out.println(shellExitStatus); 
      shellIn.close(); 
     } catch (Exception ignoreMe) { 
     } 
    } 
} 

스크립트 'a-script-which-outputs-huuggee-data.sh이'처럼 보일 수 있습니다 : 같은

자바 파일을 볼 것이다 대답. :)

답변

5

왜냐하면 당신은 Process '출력을 읽지 않기 때문입니다.

class' Javadocs에 따르면, 이렇게하지 않으면 교착 상태가 발생할 수 있습니다. 프로세스는 IO 버퍼를 채우고 "셸"(또는 청취 프로세스)에서 읽기 및 비우기를 기다립니다. 한편이 작업을 수행해야하는 프로세스는 프로세스가 종료 될 때까지 기다리는 것을 차단합니다.

getInputStream()으로 전화를 걸어 안정적으로 (다른 스레드에서) 읽음으로써 프로세스 차단을 중지 할 수 있습니다.

또한 Five Java Process PitfallsWhen Runtime.exec() Won't (일반적인 문제에 대한 유용한 정보는 Process을 참조하십시오.

+0

감사 톤! 당신 말이 맞았습니다, 그것이 문제였습니다. – pavanlimo

2

입력 스트림을 읽는 일은 결코 없으므로 입력 버퍼가 가득차 때문에 차단되었을 수 있습니다.

0

입출력 버퍼의 크기는 제한되어 있습니다 (운영 체제에 따라 다름). 내가 정확히 기억한다면 이것은 적어도 크거나 윈도우 XP가 아니었다. 가능한 한 빨리 InputStream을 읽는 스레드를 작성하십시오. 이 라인을 따라

뭔가 : 관심과 응답에 대한

class StdInWorker 
      implements Worker 
    { 
     private BufferedReader br; 
     private boolean run = true; 
     private int linesRead = 0; 

     private StdInWorker (Process prcs) 
     { 
      this.br = new BufferedReader(
        new InputStreamReader(prcs.getInputStream())); 
     } 

     public synchronized void run() 
     { 
      String in; 
      try { 
       while (this.run) { 
        while ((in = this.br.readLine()) != null) { 
         this.buffer.add(in); 
         linesRead++; 
        } 

        Thread.sleep(50); 
       } 
      } 
      catch (IOException ioe) { 
       ioe.printStackTrace(); 
      } 
      catch (InterruptedException ie) {} 
     } 
    } 
} 
+0

너 Works 클래스 뭐라 구요? – KillBill

관련 문제