linux SIGTERM과 SIGKILL의 차이

SIGTERM과 SIGKILL

SIGTERM이나 SIGKILL 모두 유닉스 계열에서 어떤 프로세스를 종료시킬 때 사용합니다. 두 명령어 모두 프로세스를 종료시킬 때 사용한다는 목적 관점에서는 유사하지만, 둘의 동작 방식에는 약간 차이가 있습니다.

SIGTERM

SIGTERM은 좀더 부드러운, 덜 강압적인 종료 방식입니다. 프로세스를 종료하라고 신호를 보낸 후, 프로세스가 스스로 종료할 때까지 기다려줍니다.

어떤 프로세스가 SIGTERM 명령어를 수신한 경우, 이 명령어를 캐치하고 종료전 파일을 저장한다거나, 열린 파일을 닫는 등 clean up 코드를 실행할 수 있습니다.

프로세스가 SIGTERM 시그널을 수신했는데, 그에 대한 핸들러가 구현되어 있지 않다면, 곧바로 graceful shutdown을 수행합니다.

SIGKILL

SIGKILL은 SIGTERM에 비해 즉각적이고, 강압적입니다. 시그널을 받자마자 곧바로 프로세스를 강제 종료합니다.

강제 종료시키기 때문에, SIGTERM과 달리 열린 파일을 닫거나 데이터를 정리할 시간이 주어지지 않습니다.

만약 어떤 자원을 사용중이었다면 곧바로 반납하게 됩니다.

SIGTERM과 SIGKILL을 비교하면

SIGTERM은 말하자면, 언제까지 방빼라고 하고 세입자에게 시간을 주는 것과 비슷합니다. 반면, SIGKILL은 별다른 통보 없이 강제 철거를 하거나 퇴거를 하는 것과 비슷하나도 볼 수 있습니다.

SIGKILL이 즉각적으로 동작해서 빠르다고 느낄 수 있지만, SIGTERM은 정리 작업할 시간을 주기 때문에 보통 SIGTERM을 먼저 사용하는 것을 권고합니다.

SIGKILL은 최후의 수단으로 늦게 사용해야 기대치 않은 동작을 줄일 수 있습니다.

SIGTERM, SIGKILL 사용법

SIGTERM이나 SIGKILL이나 리눅스 계열에서는 모두 kill 명령어를 사용합니다.

$ kill [signal] [pid]

가 기본 형식입니다.

$ kill -TERM 12345
$ kill 12345

위와 같이 실행하면, SIGTERM 신호를 해당 프로세스에 보내고, 종료될 때까지 기다려줍니다.

$ kill -KILL 12345
$ kill -9 12345

위와 같이 실행하면, SIGKILL을 프로세스 12345에 보내서, 즉시 강제 종료시킵니다.


Leave a Reply