[Gracefully Stop in Docker](https://www.ctl.io/developers/blog/post/gracefully-stopping-docker-containers/#:~:text=The docker stop command attempts,SIGKILL signal will be sent.)

원래 SIGKILL은 OOM이 발생했거나, kill -9 명령어로 process를 종료할 때 발생되는 메시지이다. 그리고 원래 SIGKILL은 어떠한 상황에서도 이를 handling할 수 있는 방법이 없다.

만약 docker stop 명령어를 내리면, 처음에는 SIGTERM을 보내고, 10초 간 기다렸다가 SIGKILL을 보내게 된다. 그리고 docker kill을 날리면 Exit code 137 즉, SIGKILL)을 발생시키면서 모든 프로세스가 종료된다. 다만, docker kill —signal을 통해서 내가 지정한 signal을 날릴 수 있다.

따라서 python에서도 SIGKILL을 핸들링할 수 있는 방법이 존재하지 않고, 오직 SIGTERM과 SIGHUP만이 처리될 수 있다. 즉 사실상 document에 있는 것과 달리, finally는 반드시 종료되는 상황에서의 실행을 보장하지 않는다.

Gracefully stopping in Python

import signal

class GracefulKiller:
    kill_now = False

    def __init__(self):
        signal.signal(signal.SIGINT, self.exit_gracefully)
        signal.signal(signal.SIGTERM, self.exit_gracefully)

    def exit_gracefully(self, signum, frame):
        self.kill_now = True

if __name__ == '__main__':
		killer = GracefulKiller()
		while not killer.kill_now:
		  time.sleep(1)
		  print("doing something in a loop ...")
		
		print("End of the program. I was killed gracefully :)")

결론

docker stop 명령어가 내려졌을 때, batch for loop에 위의 코드를 적용해서 kill_now가 True일 때 raise를 시키도록하면, 최상단에 감싸진 try-finally에서 종료과정을 처리할 수 있다. (단, 1번의 batch for loop 실행이 10초가 넘어가면 안되고, finally에서 처리하는 과정도 10초가 넘어가면 안된다.)