2012-12-10 1 views
0

Java에서 ProcessBuilder 사용 ls, pwd, echo 등의 간단한 터미널 명령을 실행할 수 있습니다. 그러나 다음 코드는 종료됩니다. 왜 그런지 알아?Java 프로그램 (Eclipse)에서 특정 터미널 명령을 실행할 수 없습니다.

public static void main(String[] args) throws Exception 
{ 
    Runtime r = Runtime.getRuntime(); 
    Process p = r.exec("echo 'T W O N E I G H T' | /home/saj/g2p/mosesdecoder-master/bin/moses -f /home/saj/g2p/working/binarised-model/moses.ini"); 
    p.waitFor(); 

    BufferedReader b = new BufferedReader(new InputStreamReader(p.getInputStream())); 
    String line = ""; 
    while ((line = b.readLine()) != null) 
    { 
     System.out.println(line); 
    } 
} 

이 명령은 터미널에서 완벽하게 작동하며 실행하는데 약 15 초가 걸리고 결과를 제공합니다. 비슷한 주제를 통해 stackoverflow에 갔지만 어떤 도움도 찾지 못했습니다. 도와주세요. 미리 감사드립니다.

+0

'하지만 다음 코드가 종료됩니다. '... 예외 또는 오류는 무엇입니까? – Azodious

답변

0

InputStream 및 ErrorStream 모니터링을 고려하십시오. 출력물이 아마도 ErrorStream에 기록 될 가능성이 있으며 그 이유는 표시되는 내용이 보이지 않기 때문입니다.

Here's a good example Javaworld에서 Runtime.exec()의 일반적인 함정과 그 사용법에 관해 설명합니다. 일부 네이티브 플랫폼은 표준 입력 및 출력 스트림에 대한 제한 버퍼 크기를 제공하기 때문에

:


내가 여기에 코드의 첫번째보기에 그것을 놓친하지만 당신이 잘못하고가 무엇인지에 대한 힌트 , 입력을 즉시 쓰지 않으면 스트림 또는 하위 프로세스의 출력 스트림을 읽으면 하위 프로세스가 차단되고 심지어 교착 상태가 발생할 수 있습니다.

는이 라인을 따라 코드에 업데이트를 고려해

public static void main(String[] args) throws Exception 
{ 
    Runtime r = Runtime.getRuntime(); 
    Process p = r.exec("echo 'T W O N E I G H T' | /home/saj/g2p/mosesdecoder-master/bin/moses -f /home/saj/g2p/working/binarised-model/moses.ini"); 

    BufferedReader b = new BufferedReader(new InputStreamReader(p.getInputStream())); 
    String line = ""; 
    while ((line = b.readLine()) != null) 
    { 
     System.out.println(line); 
    } 

    BufferedReader b = new BufferedReader(new InputStreamReader(p.getErrorStream())); 
    String line = ""; 
    while ((line = b.readLine()) != null) 
    { 
     System.out.println(line); 
    } 

    p.waitFor(); 
} 

참고 : 나는 위의 게시 예제 링크로의 InputStream과 errorstream에서 출력을 표시 처리하는 스레드를 생성 제안 .

+0

ok 나는 당신이 말하는 것을 시도 할 것이지만, 왜 그것이 2-3 초 만에 끝나고 있는지 .. ~ 15 초를 달리기로되어있다. – saj1919

+0

@ saj1919 : 글쎄, 나는 당신이 어떤 종류의 예외를 겪고 있다고 생각할 것이다. 그래서 그 과정이 당신이 원하는 방식으로 행동하지 못하는 것이다. 내가 왜 당신이 오류 스트림을 모니터 할 것을 제안했는지 이유 중 하나가 바로 – Sujay

+0

나는 이것을 시도했지만 여전히 같은 결과를 얻었습니다. termination b = new BufferedReader (new InputStreamReader (p.getErrorStream())); \t \t line = ""; \t \t 동안 ((라인 b.readLine =())! = NULL) \t \t \t \t { 에서 System.out.println (행); \t \t – saj1919

2

("bash는" "- C를", "에코 ABC 방송") echo 명령으로

ProcessBuilder를 B = 새로운 ProcessBuilder를 당신의 명령을 대체 ....이 유 도움이 될 수이 코드를 bash.Just를 사용하십시오;

Process termProc = null; 

    try { 
     termProc = b.start(); 
     BufferedReader stdInput = new BufferedReader(new 
     InputStreamReader(termProc.getInputStream())); 
     BufferedReader stdError = new BufferedReader(new 
     InputStreamReader(termProc.getErrorStream())); 

     String s = null; 
     while ((s = stdInput.readLine()) != null) 
     { 
      System.out.println(s); 


     } 
     while ((s = stdError.readLine()) != null) 
     { 

      System.out.println(s); 

     } 

    } catch (IOException e) { 

     e.printStackTrace(); 
    }