Closed beaniejoy closed 1 year ago
$ pgrep -f [module_name]
$ kill -9(or -KILL) [PID]
kill
command
-9
, -KILL
: 즉시 종료, SIGKILL, 요청에 대한 스레드 수행 중에도 그 즉시 중단-15
, -TERM
: 현재 프로세스, 스레드 수행 완료 이후 종료(권장)@RestController
class TestController {
companion object: KLogging()
@GetMapping("/test")
fun test(): ApplicationResponse<String> {
logger.info { "start!!!!" }
Thread.sleep(10 * 1000)
logger.info { "end!!!!" }
return ApplicationResponse.success().data("test")
}
}
위와 같이 설정후 애플리케이션 실행 > GET 요청 중 kill -9
, kill -15
비교
2023-05-20 18:06:55.784 INFO [nio-8080-exec-1] [884debe6] i.b.d.d.cafe.controller.TestController : start!!!!
Process finished with exit code 137 (interrupted by signal 9: SIGKILL)
요청 처리 중임에도 즉시 종료(SIGKILL)
- kill -15
java.lang.InterruptedException: sleep interrupted at java.base/java.lang.Thread.sleep(Native Method) at io.beaniejoy.dongnecafe.domain.cafe.controller.TestController.test(TestController.kt:15) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ...
org.apache.catalina.connector.ClientAbortException: java.nio.channels.ClosedChannelException at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:353) at org.apache.catalina.connector.OutputBuffer.flushByteBuffer(OutputBuffer.java:783) ...
sleep에 대한 interrupt 발생해서 `InterruptedException` 예외 발생
**요청 보낸 client 입장에서 아무런 응답을 받지 못함**
([ClientAbortException 관련 내용](https://perfectacle.github.io/2022/03/20/client-abort-exception-deep-dive-part-01/))
spring boot 기본 tomcat shutdown 방식은 `immediate`로 되어 있음
> `-TERM`: 프로세스를 종료시키기전에 시그널에 대한 handling하는 코드 적용 가능
> immediate 방식은 종료 전 수행하는 handler가 없이 바로 종료라서 그런 것인지???
### Spring graceful shutdown
```yaml
# application.yml
spring:
lifecycle:
timeout-per-shutdown-phase: 35s # 기본값은 30s 이다.
server:
shutdown: graceful
이렇게 적용하고 kill -TERM 방식으로 종료하면 응답을 건네주고 애플리케이션을 종료
Jenkins 이용한 배포 프로세스 구축 (1) 이어서 진행
지금은 단순 중단 배포 방식으로 적용
(추후 무중단 배포 방식 적용할 것)