[Linux] kill

KILL

kill은 리눅스를 많이 사용하지 않은 사람이라도 거의 대부분 알고 있는 명령어로, 특정 이벤트가 발생했음을 프로세스에게 알리는 역할을 합니다.

시그널은 숫자 값으로 정의돼 있으며, 숫자보다 기억하기 쉬운 유의미한 이름도 부여돼 있습니다. 참고로 최초 시그널 번혼느 1로 시작하는데, 1번 시그널은 터미널과 프로세스의 연결이 끊겼음을 읨하는 SIGHUP(Hang Up)을 의미합니다. 시그널의 숫자와 의미하는 유닉스 포준 중 하나인 POSIX에 정의돼 있습니다.

개발자는 프로그램을 만들 때 특정 시그널을 수신했을 때의 처리 로직(시그널 핸들러)을 작성할 수 있으며, 이를 통해 수신한 시그널의 종류에 따라 다르게 동작하게 만들 수 있습니다. 시그널 핸들러를 특별히 지정하지 않았을 경우 기본 정의된 액션이 동작하며, 이 액션은 시그널의 종류에 따라 다릅니다.

기본 정의된 액션
액션명동작
TERM시그널을 수시한 프로세스 종료
IGN시그널 무시
CORE시그널을 수신한 프로세스를 종료하면서 코어 덤프 파일을 생성
STOP시그널을 수시한 프로세스 정지
CONT중지된 프로세스 재시작

프로세스에 시그널을 전송하는 KILL 명령어 사용법은 다음과 같습니다.
kill -signum pid

signum 옵션은 SIGHUP 같은 시그널명에서 sig 접두사를 떼고 사용하거나 숫자 1처럼 바로 시그널 번호를 쓰는 두 가지 방식으로 사용할 수 잇습니다.

다음 두 명령어는 동일한 의미입니다.

# pid 1234 프로세스에 hung up 시그널 전송
$ kill -1 1234
$ kill -hup 1234

# pid 1234 프로세스에 kill 시그널 전송
$ kill -9 1234
$ kill -kill 1234

signum 옵션은 생략할 수 있으며, 생략 시 TERM 시그널을 전송합니다. 프로그램에서 별도의 시그널 핸들러를 만들지 않았을 경우 기본 시그널 핸들러인 "프로세스 종료" 기능이 수행됩니다.

시그널 전송 명령어의 이름이 KILL인 이유는 종료를 시킨다고 생각을 할 수 있는데 KILL 만을 전송하는 것이 아니라 다른 시그널을 보낼수 있는데 프로세스를 종료시키는 명령어라고만 오해하시면 안됩니다.

핸들러를 지정할 수 없는 시그널

KILL(9),STOP(19) 두 시그널은 핸들러를 지정할 수 없는 시그널 입니다.
프로세스가 이 시그널을 받으면 내부의 자원 반납과 정리 루틴을 호출하지 못하고 바로 종료돼 버릴 수 있으므로 TERM이나 INT 로 종료되지 않는 프로세스외에는 일반적으로 사용하지 않는 것이 좋습니다.

프로세스를 안전하게 종료시키는 방법

kill -TERM PID 또는 kill -INT PID같이 TERM(Termination)이나 INT(Interrupt) 시그널을 전송하는 것입니다. 자바 가상머신도 TERM 시그널을 수신할 경우 깨끗하게 종료되니 톰캣이나 기타 자바 가상 머신위에서 실행되는 프로그램을 종료할 때 KILL 시그널을 바로 보내지 말고 두세 번 정도 TERM(15) 시그널을 보내고, 그래도 종료되지 않을 경우 KILL 시그널을 전송하는 것이좋습니다.


리눅스에서 서비스 프로세스를 관리하는 service 명령어도 TERM 시그널을 보낸 후 일정 시간이 지난 후에도 프로세스가 종료되지 않았으면 KILL 시그널을 보내도록 구현돼 있습니다.

프로세스가 fork해서 자식 프로세스가 여러 개인 경우 이를 한 번에 종료시키려면 스크립트를 이용해 프로세스의 PID를 모두 구한 후 파이프를 이요해 awk로 명령어를 구성해서 종료할 수 있습니다.

# ps -eaf PROCESS_NAME| grep -v grep|awk '{print "kill -TERM "$2}' | sh -x

만약, httpd 프로세스를 모두 종료할 경우 다음과 같이 수행하면 됩니다.

# ps -eaf httpd|grep -v grep|awk '{print "kill -TERM "$2}' | sh -x

좋은 웹페이지 즐겨찾기