리눅스에는 kill 명령이 있습니다. 이에 대해서 간단하게 알아보겠습니다.

 


 그 전에, 이 명령을 이해하기 위해서 필요한 시그널에 대해서만 잠깐 짚고 넘어가겠습니다.

 

 먼저, Term, Ign, Core, Stop, Cont 같은 것들이 있는데요. 이는 아래 그림의 Action을 보기 위해서 봐야 할 값들입니다. 이 중에 Term은 디폴트 액션이 종료인 것을 의미합니다. 예를 들어, SIGKILL을 날리면, 종료가 됩니다. 디폴트가 Term이라는 이야기입니다.

 

 

 각 Signal들을 보냈을 때 디폴트 action과 간단한 설명 등을 나타내는데요. SIGHUP는 저번에 한 번 언급을 했었습니다. putty로 ssh 접속을 했습니다. A라는 프로세스를 돌렸습니다. 그 상태에서, 접속을 끊었습니다. 그랬더니 어랏? 저 시그널이 발생했다고 이야기를 했었습니다.

 

 저것을 무시하려면 nohup를 써야 했습니다. 이것은 여기에 설명이 되어 있으니 보셔도 좋을 듯 싶군요.

 

 그런데 저번에도 언급을 했지만, SIGKILL과 SIGSTOP은 caught가 되거나, 블락이 되거나, 무시가 될 수 없습니다. 잠깐. 무시가 되거나, 잡힐 수 없다. 블락도 될 수 없고. 그 이야기는 해당 시그널이 전송이 되면, 생각할 여지조차 주지 않는다는 이야기입니다.

 

 

 해당 명령어는 번호를 줄 수도 있는데, 9번이 SIGKILL을 의미합니다.

 

 

 그리고 SIGTERM이 15라고 되어 있습니다. 일단, 이 두 번호는 기억해 둘 필요가 있습니다.

 


 제가 오늘 설명할 명령어는, 시그널을 process에 보내는 명령어입니다. ~ 9 pid로 쓰면, pid에 9번 신호를 보내겠다는 의미입니다. 그런데 이게 종료이고, 무시가 될 수 없습니다.

 

 

 이 신호가 디폴트가 terminate라고 하였습니다. 그리고 Ignore가 되거나 catch가 될 수 없다고 하였습니다. 그런데 스택 오버플로우 같은 답변을 보면, 9번을 바로 쓰는 것을 그리 추천하지는 않습니다. 대신에 링크 두개를 보시면, 유독 많이 보이는 것이 15번을 먼저 써 보라고 하는데요. SIGTERM 역시 기본 동작은 term입니다. catch가 될 수 있다는 점이 다른데요. 이건 간단하게 프로그램을 작성해 보겠습니다.

 

 

 my_handler는 I will exit를 출력하고 프로세스를 종료해 버립니다.

 

 

 그리고, main 함수에서는 SIGTERM 신호가 발생하였을 때, my_handler가 실행되게끔 해 놓았습니다. 그러면 프로그램의 흐름은 계속 while loop를 돌다가 TERM signal이 떨어지면, my_handler로 가서 해당 로직을 수행하고 종료한다. 이 정도가 될 겁니다.

 

 signal.c를 컴파일 했습니다. 이것의 실행파일 이름은 signal 입니다. 이것을 실행시켰을 때 프로세스 pid를 보니까 20447입니다.

 

 

 종료를 시키고 다시 ps -aux와 grep으로 보니, 20447이 없어졌습니다.

 

 이는, catch가 되어서 I will exit라는 것을 출력할 수 있었다는 것을 의미합니다. 이 상황을 정리를 했다로 바꿔보면 됩니다.

 

 그러면 무시도 안 되고, catch도 안 된다는 9번은 어떨까요? sigaction의 1번째 인자만 바꿔서 다시 실행해 보겠습니다.

 

 

 21615번입니다. 이 상태에서 다음 명령어를 쳐 보도록 하겠습니다.

 

 

 그러면 9번 시그널을 pid가 21615번인 ./signal로 보낼 겁니다.

 

 

 어떻게 되었을까요? 그냥 종료가 되어버렸습니다. I will exit 출력도 없이. catch가 되지 않는다는 말은 이런 뜻입니다. 무시 되지도 않고 블럭되지도 않고, catch되지 않는 9번은, 최후에 쓰라는 이야기가 되겠네요.