일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- redis
- Oracle
- linux
- Gradle
- java
- jsp
- php
- ReactJS
- Spring Batch
- Web Server
- Git
- Spring Boot
- MySQL
- jenkins
- 요리
- javascript
- Design Patterns
- springboot
- 맛집
- ubuntu
- db
- tool
- JVM
- elasticsearch
- Spring
- devops
- it
- AWS
- IntelliJ
- laravel
- Today
- Total
아무거나
Runtime.getRuntime().exec() 호출시 종료되지 않는 문제 본문
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 |