파이문

Java ShutdownHook With Signal 본문

TIL

Java ShutdownHook With Signal

민Z 2020. 10. 29. 23:34

자바로 코드를 작성할 때 gracefully 하게 종료하기 위해 ShutdownHook 을 사용하곤 한다.

Runtime.getRuntime().addShutdownHook(new Thread(() -> { ... }));

프로세스를 중지하는 시나리오가 잘 있으면 좋겠지만, 강제 종료할 경우도 꽤 있을 것이다.

강제 종료의 경우 인터럽트 시그널인 kill -9 를 자주 썼었다. (각 시그널 번호가 뜻하는 의미는 인터넷에 매우 많으니 패스)

 

SIGKILL (kill -9) 를 해도 ShutdownHook 이 되는지가  궁금했는데 결론부터 말하자면 안된다.

만약 프로세스 ShutdownHook 이 동작하게 하고 싶다면 SIGTERM(15)을 사용하도록 하자. (참고로 SIGINT(2) 도 된다. 인텔리제이에서의 중단은 SIGINT 로 동작한다.)

 

SIGTERM 과 SIGKILL 둘다 process 를 termination 시키는 것이다.

  • SIGTERM 은 gracefully 하게 프로세스를 종료 시키는 것이고 SIGKILL 은 프로세스를 즉시 종료 시킨다.
  • SGITERM 시그널은 처리하고, 무시하고, 블락할 수 있지만 SIGKILL 은 처리하거나 블락할 수 없다.
  • SIGTERM 은 자식 프로세스를 죽이진 않지만 SIGKILL 은 자식 프로세스도 죽인다.

덧붙이자면 리눅스에서 OOM Killer 는 SIGKILL 로 죽인다고 한다.

 

참고

linuxhandbook.com/sigterm-vs-sigkill/

stackoverflow.com/questions/2541597/how-to-gracefully-handle-the-sigkill-signal-in-java

Comments