2011-11-03 1 views
0

Java Runtime :: exec 메소드를 통해 Windows 배치 파일을 실행하고 싶습니다. 내 배치 파일 내에서 Java 프로그램을 실행하기 위해 다른 배치 파일을 실행합니다. 이 첫 번째 배치 파일은 "start"를 사용하여 두 번째 배치 파일을 실행합니다.Process Runtime Exec을 사용하여 "Start"로 배치 파일 실행

첫 번째 배치 파일이 완료 될 때까지 대기하고 두 번째 배치 파일은 신경 쓰지 않을 때까지 Runtime :: exec을 호출하는 메인 스레드를 원한다. Process :: getInputStream()과 Process :: getErrorStream()을 2 개의 개별 스레드에서 모두 소비하고 있습니다. 내 메인 스레드 (Runtime :: exec를 실행하는 스레드)는 2 스트림을 소비하는 스레드가 끝날 때까지 기다렸다가 계속하기 전에 기다린다.

그러나 첫 번째 배치 파일 실행이 끝난 후에도 내 스트림 소비 스레드가 계속 읽기 때문에 두 번째 배치 파일이 완료 될 때까지 내 메인 스레드가 항상 차단된다는 사실을 발견했습니다. 두 번째 배치 파일의 출력 및 오류 스트림을 무시하도록하려면 어떻게합니까?

start "" batch2.bat 
exit 

이 batch2.bat에서, 내가 자바 프로그램을 실행

:

Runtime runtime = Runtime.getRuntime(); 
String[] cmd = new String[]{"cmd.exe", "/C", "batch1.bat"}; 
Process proc = runtime.exec(cmd); 
StreamLogger errorLogger = new StreamLogger(proc.getErrorStream()); // consume 
StreamLogger outputLogger = new StreamLogger(proc.getInputStream()); // consume 
errorLogger.start(); // start reading the error stream in another thread 
outputLogger.start(); // start reading the output stream in another thread 
returnCode = proc.waitFor(); 
log.debug("Obtained return code"); 
errorLogger.join(); 
outputLogger.join(); 
log.debug("Finished reading from streams"); 

시키면서 batch1.bat은 다음과 같습니다

내가 내 메인 스레드에서 첫 번째 배치 파일을 실행하는 방법입니다 (java.exe 또는 javaw.exe로 실행 해 보았습니다)

javaw.exe -cp . MyProgram 1>outlog 2>errlog 

요약하면, 주 스레드를 실행할 때 다음을 얻을 수 있습니다. e batch1.bat가 완료되면 반환 코드가 반환됩니다. waitFor()는 차단 해제하지만 "errorLogger.join()"및 "outputLogger.join()"때문에 batch2.bat 및 javaw.exe가 종료 될 때까지 주 스레드가 차단됩니다. batch2.bat에서 출력을 읽는 것에 관심이 없습니다. batch1.bat가 끝나면 내 주 스레드를 반환하는 방법은 무엇입니까?

답변

0

waitFor 메서드를 사용할 때 batch2.batbatch1.bat과 같은 프로세스에서 실행되는 경우 발생합니다.

  1. 이 스크립트를 사용하여 내 머리 위로 떨어진

    , 나는 (당신이 정말로 실행 완료 첫번째 배치 파일을 대기 할 경우) 당신은 몇 가지 옵션을 가지고 말할 것 batch2.bat에 대해 독립적 인 프로세스를 호출 할 수 있습니다.

  2. outputlogger에 마커를 보내면 부모 프로세스에 batch1.bat이 실행을 완료했음을 알리고 waitFor을 사용하지 마십시오. 이렇게하면 코드 로직을 계속 진행하는 데 도움이됩니다.
+0

사실, 제 코드는 batch1.bat가 완료된 후 waitFor 메소드에서 차단되지 않습니다. batch2.bat가 완료 될 때까지 "errorLogger.join()"및 "outputLogger.join()"에서 블로킹됩니다. – yoroshiku

+0

batch1.bat에서'start cmd/c batch2.bat'을 시도하십시오. 또한,'ErrorLogger.join()'에서 코드 블록을 처리 할 때) 마지막 실행에서 로그에이 행''반환 코드 ""가 있습니까? – abhinav

+0

고마워, 나는'start cmd/c batch2.bat'을 시도했지만 같은 결과를 얻었다; 내 로그는 batch1이 완료된 후에''돌아온 코드를 얻는다 ''를 보여주고, batch2가 끝날 때까지 errorLogger.join()에서 내 코드가 여전히 블록된다. – yoroshiku

0

start/b batch2.bat를 통해 두 번째 배치를 호출 해 보았습니까?

+0

아니요, 시도하고 결과를 게시 할 것입니다. – yoroshiku