강좌 & 팁
대부분 응용 프로그램을 죽일때 많이들 사용하십니다
kill -9 pid 뭐 이렇게들 사용하시지요...
명령어 이름이 kill 이다 보니... 아... 프로세스를 죽이는 명령어구나... -9 는 옵션쯤? 되겠네...
하고 생각을 하죠...
하지만... 그렇지 않다는거!
사실 kill 명령어는 프로세스를 죽이는 명령어가 아닙니다.
프로세스에게 signal 을 보내주는 명령어지요.
help 를 보시면 아래와 같은 설명이 있습니다.
KILL(1) Linux User's Manual KILL(1)
NAME
kill - send a signal to a process
네 바로... 프로세스에게 시그널을 보내주는 명령입니다.
-9 의 경우가 바로 kill 옵션에 해당하는 특히나 block 되도록 하는 옵션을 포함한 kill 입니다.
응용프로그램은 이러한 시그널을 언제 받을까요?
실행하고 있는 중간에 시그널이 오면 인터럽트처럼 똭!.... 받느냐? 아닙니다~
커널 모드에서 시스템 콜이나 인터럽트 수행을 마치고 유저모드로 돌아오기 직전에
전달할 시그널이 있는지 검사합니다.
있다면 등록된 함수를 수행하거나 관련 처리를 하게 됩니다.
이 차이점은 디버깅에서 묘한 수행상의 문제를 만들어 낼수 있습니다.
단일 프로세스 환경에서는 시그널을 발생시켜 주는 프로세스가 실행되어야
시그널을 받는 프로세스가 받을수 있습니다 당연한가요?
위에서 언급한 "프로세스 실행중에 시그널이 들어오면".... 이란 가정은 사실 단일 프로세스에서는
매우 부적절한 상황 묘사입니다.
시그널을 발생시켜 주는 소스가 커널 모두가 아닌 이상 내 프로세스 실행중에는 자기 자신에게
보내는 시그널이 아니면 보낼수 없기 때문입니다. (스케쥴링에 대한 것은고려하지 않을때)
하지만 멀티 프로세스 환경에서는 또 달라집니다. 동시에 여러개의 프로세스가 마구 실행되므로
위의 가정이 무난한 표현이 되어 버립니다.
어찌되었든 kill 명령어는 프로세스를 죽이는 명령어가 아니고 -9 라고 표시된 것이 시그널의 종류중에서 9번이 KILL 옵션입니다.
다른 시그널의 종류를 볼까요?
help 에 나오는 내용을 보면 간략히 아래처럼 나오게 됩니다.
SIGNALS
The signals listed below may be available for use with kill. When known constant, numbers and
default behavior are shown.
Name Num Action Description
0 0 n/a exit code indicates if a signal may be sent
ALRM 14 exit
HUP 1 exit
INT 2 exit
KILL 9 exit cannot be blocked
PIPE 13 exit
POLL exit
PROF exit
TERM 15 exit
USR1 exit
USR2 exit
VTALRM exit
STKFLT exit might not be implemented
PWR ignore might exit on some systems
WINCH ignore
CHLD ignore
URG ignore
TSTP stop might interact with the shell
TTIN stop might interact with the shell
TTOU stop might interact with the shell
STOP stop cannot be blocked
CONT restart continue if stopped, otherwise ignore
ABRT 6 core
FPE 8 core
ILL 4 core
QUIT 3 core
SEGV 11 core
TRAP 5 core
SYS core might not be implemented
EMT core might not be implemented
BUS core core dump might fail
XCPU core core dump might fail
XFSZ core core dump might fail
실제로 kill 뒤에 -9 라고 하는 것은 이렇게도 사용할수 있습니다.
kill -s KILL pid
name 을 쓸것이냐 number 를 쓸것이냐의 차이뿐이죠.