2013-08-28 2 views
0

문제점이 있습니다. JBoss Server를 시작하기 위해 java 코드에서 sh 파일을 실행하려고 했으므로이 sh 파일을 실행할 때 콘솔이 시작되고 인쇄되는 것을 알고 싶습니다. 내 코드는 다음과 같습니다.대기 결과없이 sh 파일을 실행하는 방법은 무엇입니까?

public static void runStart() { 
     try { 
      String command = "./Run.sh"; 
      String s = get_commandline_results(command); 
      System.out.println(s); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     System.out.println("done"); 
    } 

    public static String get_commandline_results(String cmd) 
      throws IOException, InterruptedException, IllegalCommandException { 

     String result = ""; 
     Process p = null; 
     p = Runtime.getRuntime().exec(String.format("bash -c %s", cmd)); 
     final ProcessResultReader stderr = new ProcessResultReader(
       p.getErrorStream(), "STDERR"); 
     final ProcessResultReader stdout = new ProcessResultReader(
       p.getInputStream(), "STDOUT"); 
     System.out.println("starting..."); 
     stderr.start(); 
     stdout.start(); 
     final int exitValue = p.waitFor();// It was delayed here because sh not complete 
     System.out.println("started!");// How to go to here? 
     if (exitValue == 0) { 
      result = stdout.toString(); 
     } else { 
      result = stderr.toString(); 
     } 
     return result; 
    } 
} 

class ProcessResultReader extends Thread { 
    final InputStream is; 
    final String type; 
    final StringBuilder sb; 

    ProcessResultReader(final InputStream is, String type) { 
     this.is = is; 
     this.type = type; 
     this.sb = new StringBuilder(); 
    } 

    public void run() { 
     try { 
      final InputStreamReader isr = new InputStreamReader(is); 
      final BufferedReader br = new BufferedReader(isr); 
      String line = null; 
      while ((line = br.readLine()) != null) { 
       this.sb.append(line).append("\n"); 
      } 
     } catch (final IOException ioe) { 
      System.err.println(ioe.getMessage()); 
      throw new RuntimeException(ioe); 
     } 
    } 

    @Override 
    public String toString() { 
     return this.sb.toString(); 
    } 
} 

감사합니다.

답변

2

여기에 모순되는 목표가 있습니다. 스크립트 종료를 기다리지 않고 (즉, JBoss를 실행하기를 기다리지 않고) 계속 진행하면서 동시에 결과를 알고 싶습니다. 타임머신을 만들지 못하는 것은 불가능합니다.

#!/bin/bash 

nohup base -c ./Run.sh > /dev/null & 

참고 : 당신이 할 수있는 일

는 다른 스크립트 start.sh 내에서 스크립트를 시작할 수 있습니다 당신은 Run.sh 실행함으로써 bash -c를 생략 할 수 있습니다.

이 스크립트는 백그라운드 프로세스로 Run.sh을 시작하고 즉시 종료됩니다. JBoss를 시작할 수 없으면 나중에 발생하기 때문에 오류가 발생하지 않습니다.

이 딜레마에 대한 한 가지 해결책은 JBoss의 로그 파일을 몇 초 동안 읽거나 "JBoss가 성공적으로 시작되었습니다"라는 텍스트 행을 볼 때까지 스크립트입니다.

이렇게하려면 시작 스크립트를 사용하고 Java 코드에서 JBoss의 로그 파일 읽기를 시작하십시오 (먼저 표시 될 때까지 기다려야 할 수도 있음).

이런 종류의 트릭을 위해서는 JBoss를 시작하기 전에 먼저 오래된 로그 파일을 삭제할 때 좋습니다. 그렇지 않으면 Java 프로그램이 이전 로그 파일을 읽고 JBoss가 새 로그 쓰기를 계속 시도하는 동안 계속할 수 있습니다.

+0

감사합니다. Aaron Digulla! 당신의 가이드에서 나는 start.sh : # .. ./Run.sh> test.txt 2> error.txt 예, 그래서 나는 "JBoss가 가지고있는 테스트 파일을 읽어야한다. 성공적으로 시작되었습니다. " 보여 주시겠습니까? –

+0

예, 그렇게해야합니다. 하지만 시간을내어 지불하지 않는 한 아무 것도 보여주지 않겠습니다 :-) 우리는 당신이하는 일을 이해하도록 노력하므로 혼자서 문제를 해결할 수 있습니다. 우리는 당신을 위해 코드를 작성하지 않습니다. –

+0

공유해 주셔서 감사합니다. 나 혼자서 코드를 작성해 주셔서 대단히 감사합니다! –