반응형
출처 : http://www.javaservice.net/~java/bbs/read.cgi?m=resource&b=qna2&c=r_p&n=1208307709&p=1&s=t

수고 많으십니다.
잘 안되는 것이 있어서 이렇게 질문 올립니다.

많은 코멘트 부탁드립니다.

Runtime을 사용하여 외부 응용프로그램을 실행하려고 합니다.
파일 변환 프로그램입니다.

해당 응용프로그램의 실행 시 명령어와 함께 파일 변환을 위한 다수의 옵션 등도
입력하여 실행하게 되어 있습니다.(input file명, ouyput file 명 등 옵션)

문제는...

예를 들어..

String cmd = "cmd.exe /C c:\\dir\\sub_dir\\doEencoder.exe " + inputFile + " " + outputFIle
Runtime runtime = Runtime.getRuntime();
runtime.exec(cmd);

실행하면, 결과가 잘 나옵니다.

그런데....

BufferedReader is;
String line;
String cmd = "cmd.exe /C c:\\dir\\sub_dir\\doEencoder.exe " // 명령어 예입니다.
+ inputFile + " " + outputFIle;

Runtime runtime = Runtime.getRuntime();
Process p = runtime.exec(cmd);
is = new BufferedReader(new InputStreamReader(p.getInputStream()));
while ((line = is.readLine()) != null)
System.out.println(line);

p.waitFor();
.
.
.
.

하면, 중간에 멈춰서 진행이 안됩니다. hang이 걸리는 거죠.

해당 응용프로그램을 콘솔에서, 직접 실행하면, 파일 변환 과정이 출력됩니다.

파일 변환 프로그램이므로...한 라인에서 진행율이 변경되는 형태의 출력입니다.

그 때문인 것 같기도 하구요.

작업관리자에서 프로세스를 보면...

손으로 직접 실행하거나, Process로 반환 받지 않고 실행할 경우...
정상적으로 해당 응용프로그램이 작업관리자 프로세스에 올라 왔다가 파일 변환 종료 후
사라지고요...

두번째 예와 같이 Process로 받아서 처리하려면,
작업관리자 프로세스에 정상적으로 올라 와서...일부 수행하다가...
CPU 사용량 0이 되면서 그대로 멈춰 있습니다.

waitFor(); 부분까지도 못오는 것 같구요.
작업관리자에서 프로세스를 강제로 죽이면...
그제서야 waitFor(); 이후의 부분이 진행됩니다.

이유를 모르겠네요.

많은 코멘트 부탁드립니다.
제목 : Re: Runtime exec() 실행 시 멈춤 현상
글쓴이: 손님(guest) 2008/04/16 10:39:10 조회수:938 줄수:4

doEncoder.exe의 출력이 어떤지 알 수 없어 추측만 할 수 밖에 없을 것 같은데요,
java.io.BufferedReader.readLine()은 carridge return이나 line feed가 나올 때까지
대기합니다. 이 부분을 염두에 두시고 프로그램의 출력을 관찰해보시면
답을 찾으실 수 있으리라 생각합니다.
제목 : Re: 신경 써 주셔서 감사합니다.
글쓴이: 불만세력(guest) 2008/04/16 13:04:03 조회수:920 줄수:22

신경 써 주셔서 감사합니다.

말씀하신 부분 다시 한번 살펴 보겠습니다.
감사합니다.

우음...


질문이 길었는데요.

다시 요약을 하자면...

외부 응용프로그램을 실행하는데...

runtime.exec(cmd); 하면 되는데...

Process p = runtime.exec(cmd); 하면 안된다는 것입니다.

다른 의견 있으시면 고견 부탁드리겠나이다.

감사합니다.
제목 : Re: 제생각으로는 이부분일거 같은데.. 정확할지는 모르겠네요.
글쓴이: emeroad(guest) 2008/04/16 16:46:08 조회수:907 줄수:41

비슷한 경우를 경험한적이 있습는데, 해당 경우인거 같아서 혹시나해서...

윈도우의 경우 화면에 뿌려지는 버퍼를 비워주지 않으면 블러킹 상태로 빠집니다.

유닉스의 경우 해당되지 않구요.

테스트 하실려면 긴결과를 출력하는 (dir 같은게 잇겠죠.) 같은걸 실행한다음에

결과가 모두 뿌려지는지 보면 됩니다. 중간에 뿌리다가 말면(즉 버퍼가 다 차서 블럭킹된겁니다.)

해당 케이스 일경우가 높습니다.


해결방법은 쓰레드를 사용해서 버퍼를 계속 비워줘야 합니다.

예전에 사용한 클래스인데. 이런 코드를 사용해서 쓰레드를 동작시켜서 버퍼를 비우면서
작업을 해야합니다.


public class StreamGobbler extends Thread
{
InputStream is;

public StreamGobbler(InputStream is) {
this.is = is;
}

public void run()
{
try {
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;
while ( (line = br.readLine()) != null)
System.out.println(line);
} catch (IOException ioe) {
System.out.println(ioe);
}
}
}
제목 : Re: [감사] 해결되었네요.
글쓴이: 불만세력(guest) 2008/04/16 17:36:47 조회수:831 줄수:12

고견 주신 닉 불명의 손님과 emeroad님께 깊은 감사의 말씀 드립니다.

"손님" 코멘트 듣고, 이것 저것 해보다가,
"emeroad" 님께서 주신 조언과 같은 내용의 레퍼런스를 읽고 적용해보니,
해결되었습니다.

역시...경험에서 오는 노하우가 중요하네요.

두 분과 아울러, 코멘트는 아직 안주셨지만,
질문을 읽고 신경 써 주신 모든 분들께 감사의 말씀을 드립니다.

감사합니다.
제목 : Re: 제 경험으로는....
글쓴이: 손님(guest) 2008/04/17 13:47:46 조회수:768 줄수:5

윈도우에서는 
ps.waitFor();
이 부분에서 멈춰 버리더군요.
이 부분을 주석 처리했더니 잘 수행 되더라구요..
물론 같은 경우일 수는 없겠지만요 ^^
제목 : Re: 불만세력님 어떻게 적용하셨는지 예제 소스좀 올려주세요
글쓴이: 손님(guest) 2008/04/18 17:11:15 조회수:711 줄수:1

저도 같은 문제에 봉착했는데 미치겠군요 ㅜ_ㅜ
반응형
Posted by Real_G