2010-07-29 6 views
1

다음 코드는 STDERR 및 STDOUT에 쓰는 perl 스크립트를 호출합니다. 필자는 perl 스크립트에서 STDOUT 및 STDERR을 자동으로 플러시하고 streamgobbler 스레드를 사용하는 것과 같은 권장 절차를 수행했습니다. 나는이 문제를 어느정도는 돕기 위해 이것을 보았다. 그러나 펄 스크립트가 많은 양의 출력을 생성하는 곳에서는 파이프를 채우고 멈춰 버리는 경우가있다. 유일하게이 것을 멈추는 것처럼 보이지만 다음과 같이 펄 스크립트에 다음을 추가하는 것은 당연히 출력을 원한다. 그래서 이것은 옵션이 아니다.java doesnt는 필자의 perl 출력 파이프 라인을 읽는 것으로 보입니다.

갱신 >>

나는 고양이가 리눅스에서/proc 디렉토리/PID/FD/파이프 # 그것은 파이프가 액세스 할 수 읽을 수됩니다 때 또 다른 흥미로운 선두로부터입니다. 이것은 내 perl 프로세스가 다시 쓰고 따라서 완료한다는 것을 의미하는 파이프 내용을 덤프하는 것처럼 보입니다. 따라서 내 Java 프로세스가 프로세스 출력 스트림을 제대로 읽지 못하고 있어야합니다.

PERL :

close STDOUT 
close STDERR 

내 자바 StreamGobbler는 이에 다음

parserProcess = run.exec(config.getCMDArray(),env); 

StreamGobbler errorGobbler = new StreamGobbler(parserProcess.getErrorStream(), "ERROR"); 

    // any output? 
    StreamGobbler outputGobbler = new StreamGobbler(parserProcess.getInputStream(), "OUTPUT"); 

    // kick them off 
    errorGobbler.start(); 
    outputGobbler.start(); 

처럼 보인다 - 사전

+0

모든 Perl 스크립트가 STDOUT과 STDERR을 모두 닫는다면 그 사실을 알 수 있습니다.) Perl 스크립트에서도 수행 할 수있는 것을 게시 할 수 있습니까? – mfontani

답변

2

에서>

class StreamGobbler extends Thread 
{ 
    InputStream is; 
    String type; 

StreamGobbler(InputStream is, String type) 
{ 
    this.is = is; 
    this.type = type; 
} 

public void run() 
{ 
    try 
    { 
     InputStreamReader isr = new InputStreamReader(is); 
     BufferedReader br = new BufferedReader(isr); 
     String line=null; 
     while ((line = br.readLine()) != null) 
      System.out.println(type + ">" + line);  
     } catch (IOException ioe) 
      { 
      ioe.printStackTrace(); 
      } 
} 
} 



String line=""; 

status = parserProcess.waitFor(); 

감사합니다 나는 당신이 것 같아요 n을 기술하는 펄과 자바 애플 리케이션을위한 구식 행동. 파이프 뒤의 실제 버퍼 크기는/OS에 따라 다르지만 1KB 또는 16KB로 작을 수 있습니다. 출력 생성 프로세스가 텍스트가 소비 될 때까지 차단하는 것이 바람직하고 합리적입니다. 대안은 무엇입니까? 파이프 버퍼를위한 더 큰 양의 메모리 할당?

위의 코드를 사용하여 실험하는 경우 Java 콘솔 출력 (예 : System.out.println() 호출)에서 처리 속도가 병목 현상이 발생합니다. 필자가 테스트를 위해 인쇄를 주석 처리했다면, 자바가 Perl 출력을 상당히 sahppily하게 slurping하는 것을 볼 수있을 것이다.

+0

대안은 파일을 통한 프로세스 간 통신을 수행하는 것입니다. 이것은 불리한 점도 있지만 (입력 스트림, 퍼포먼스, 디스크가 채워지는 EOF 조건을 제거 할 필요가 있음에도 불구하고) 출력을 차단하지 않는 (또는 적어도 디스크가 가득 찰 때까지) 이점이 있습니다. – mob

+1

글쎄, 그는 펄 프로그램에 파일을 쓰게하고 완성까지 달린 다음, 자바 애플리케이션을 실행 시켜서 실행시킬 수있다. 두 프로그램이 나란히 실행된다는 정말로 엄격한 요구 사항이 있는지 알 수 없다. 그러나 파일을 기반으로하는 파이프를 함께 패치하는 것은 끔찍한 생각처럼 보입니다. –

관련 문제