일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- javascript
- Git
- php
- linux
- laravel
- JVM
- IntelliJ
- Spring Boot
- jenkins
- db
- java
- tool
- jsp
- Gradle
- Spring
- ubuntu
- 맛집
- ReactJS
- Spring Batch
- elasticsearch
- 요리
- it
- AWS
- MySQL
- devops
- redis
- Web Server
- springboot
- Design Patterns
- Oracle
- 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 |