아무거나

Runtime.getRuntime().exec() 호출시 종료되지 않는 문제 본문

Java & Kotlin/Java

Runtime.getRuntime().exec() 호출시 종료되지 않는 문제

전봉근 2019. 3. 8. 20:15
반응형

Runtime.getRuntime().exec() 호출시 종료되지 않는 문제


위의 함수는 process 를 실행시키기 위한 함수이다.

만약 프로세스의 수행이 끝이 날때까지 기다려야 한다면 어떻게 해야되는가..?


Process process = Runtime.getRuntime().exec(cmd); 

process.waitFor();   // waitFor()를 호출한다.

 

문제는 waitFor() 가 영원히 끝나지 않는 경우가 발생한다는 것입니다.

분명히 cmd 에 해당하는 프로세스가 종료되어야 하는데, 이상하게도 끝나지 않는다는 이야깁니다.

원인은 stream 의 버퍼가 비워지지 않았기 때문입니다.
이를 비워줌으로써 문제를 해결할 수 있습니다.

그럼 어떻게 비워주면 될까요?
waitFor() 함수를 호출하는 순간, Thread 는 process 가 종료될때까지 block 이 됩니다.
다시 말해서 해당 stream 을 비워주는 작업을 별도의 thread 에서 수행해야 한다는 이야기죠.

별도 Thread 를 만들고, 이 Thread 에서 process.getErrorStream();  process.getInputStream(); 를 통해 Stream 을 얻어온 뒤, 계속해서 read 해 줌으로써 스트림을 비워야 한다는 것입니다.

만약, process 수행결과 얻어지는 출력을 필요로 하지 않는다면 코드는 훨씬 간단해 집니다.
아래처럼 애초에 stream 을 close 해 버리면 되거든요. :)


Process process = Runtime.getRuntime().exec(cmd); 

process.getErrorStream().close(); 

process.getInputStream().close(); 

process.getOutputStream().close(); 

process.waitFor(); 
 

문제없이 process 가 실행 후, waitFor() 에서 빠져가나는 것을 확인하실 수 있습니다.


출처: http://crystalcube.co.kr/69 [유리상자 속 이야기] 

반응형

'Java & Kotlin > Java' 카테고리의 다른 글

Garbage Collection  (0) 2019.04.10
Address already in use: JVM_Bind 오류  (0) 2019.03.26
두 개의 리스트를 합치는 방법  (0) 2019.01.25
문자 체크 contains  (0) 2019.01.22
Optional.ofNullable 사용  (0) 2019.01.16
Comments