본문 바로가기

Linux

kill

kill
kill은 특정 프로세스에게 특정 시그널(signal)을 보내는 명령어이다.
즉, 특정 프로세스에게 실행종료시그널, 재시작시그널 등, 명령어의 의미에서도 알 수 있듯이 프로세스를 종료하는 용도로 사용되는 명령어이다.
또한 수퍼유저(root)는 모든 프로세스에 대하여 kill 명령어를 사용할 수 있으나, 일반사용자들은 자기가 실행시킨 프로세스에 대해서만 kill 명령어를 사용할 수 있다.
여기서 설명하는 kill 명령어는 이 책의 killall 명령어, 그리고 killall5 명령어와 함께 공부하길 바란다. 동일 목적을 가진 명령어를 함께하면 융통성 있는 실무 적용을 할 수 있다.

<명령어 위치> : /bin/kill

<사용법>
Kill [옵션] 프로세스ID

<옵션>
-s : 특별히 보낼 시그널의 이름이나 번호를 지정한다.
-p : 시그널은 보내지 않고 그 프로세스의 이름만 보여준다.
-l : 시그널의 목록을 출력한다.
아래는 kill 명령어에서 사용할 수 있는 시그널의 종류이다.

[root@localhost ~]# kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT
17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU
25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH
29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN
35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4
39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6
59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
위의 예에서 모두 63 가지의 시그널은 숫자와 시그널명으로 짝지어여 있다. 이후에 실습하겠지만 kill 명령어 사용시에 옵션으로 숫자를 사용할 수도 있고, 시그널명을 사용할 수도 있다.

# kill -9 PID

# kill –SIGNAL PID
위 두 가지는 동일한 결과를 얻는다. 숫자와 시그널명으로 사용할 수 있다는 것을 잊지 말자.
위의 시그널리스트는 모두 운영체제가 특정 프로세스에게 보내는 인터럽트(interrupt)라고 볼 수 있다. 쉬운 예로서 윈도우 시스템에서 [CTRL]+[ALT]+[DEL] 키를 동시에 눌러서, 실행되는 “작업 관리자”에서 실행중인 특정 프로그램(프로세스)를 “프로세스 끝내기”로 강제 종료할 수 있는 것과 같은 것이다.

◆ 아래 실습을 해보자!
(01) kill 명령어로 특정 프로세스 죽이기(숫자 시그널 사용)
가장 흔한 용도로 사용되는 kill 명령어의 사용 방법이다. 특정 프로세스를 종료하기 위해 사용하는 것이다. 시그널번호 9 번은 특정 프로세스를 종료하는 것이다.
[root@localhost ~]# cd /
[root@localhost /]# ps -ef | grep syslog
root 7740 1 0 10:34 ? 00:00:00 syslogd -m 0
root 8467 8426 0 10:38 pts/0 00:00:00 grep syslog
[root@localhost /]#
[root@localhost /]# kill -9 7740
[root@localhost /]#
[root@localhost /]# ps -ef | grep syslog
(02) kill 명령어로 특정 프로세스 죽이기(시그널 기호 사용)
우리는 바로 위에서 syslogd 라는 프로세스를 kill 하였다.
이 명령어를 다시 시작하여 연습해보도록 하자.
[root@localhost /]# find / -name syslogd
/usr/share/logwatch/scripts/services/syslogd
/sbin/syslogd
[root@localhost /]# ps -ef | grep syslog
root 8474 8426 0 10:40 pts/0 00:00:00 grep syslog
[root@localhost /]# /sbin/syslogd
[root@localhost /]# ps -ef | grep syslog
root 8476 1 0 10:40 ? 00:00:00 /sbin/syslogd
root 8478 8426 0 10:40 pts/0 00:00:00 grep syslog
[root@localhost /]# ps -ef | grep syslog
root 8476 1 0 10:40 ? 00:00:00 /sbin/syslogd
root 8478 8426 0 10:40 pts/0 00:00:00 grep syslog
[root@localhost /]# kill -SIGKILL 8476
[root@localhost /]#
[root@localhost /]# ps -ef | grep syslog
root 8482 8426 0 10:41 pts/0 00:00:00 grep syslog
[root@localhost /]#

◆ 각 프로세스마다의 PID는 변경된다. 즉, 한번 kill로 서비스를 kill 시킨 이후에는 그 프로세스가 생성하는 PID는 변경된다. /proc/숫자디렉토리 에서 확인할 수 있다!
(03) kill 명령어로 특정 프로세스를 재시작하는 시그널 보내기
이 옵션은 아파치(apache), proftpd, 삼바(samba) 등과 같은 응용 프로그램의 설정을 변경후에넨, 변경된 설정의 적용을 위하여 프로세스를 종료하고 다시 시작해야 한다.
이때 실행중인 프로세스에게 재시작하는 시그널(1번 시그널, HUP)을 보내면 특정 프로세스를 재시작하는 것과 동일한 결과를 얻을 수 있다.
[root@localhost /]# ps -ef | grep syslogd
root 8492 8426 0 10:44 pts/0 00:00:00 grep syslogd
[root@localhost /]#
[root@localhost /]# /sbin/syslogd
[root@localhost /]#
[root@localhost /]# ps -ef | grep syslogd
root 8494 1 0 10:44 ? 00:00:00 /sbin/syslogd
root 8496 8426 0 10:44 pts/0 00:00:00 grep syslogd
[root@localhost /]#
[root@localhost /]# kill -HUP 8494
[root@localhost /]#
[root@localhost /]# ps -ef | grep syslogd
root 8494 1 0 10:44 ? 00:00:00 /sbin/syslogd
root 8498 8426 0 10:44 pts/0 00:00:00 grep syslogd
[root@localhost /]#
(04) kill 명령어로 segmentation fault 된 프로세스 정료하기
리눅스를 관리하거나 사용하다보면 아주 가끔씩 “segmentation fault”라는 에러 메시지를 확인할 수 있다. 이 에러 메시지는 메모리의 비정상적인 사용이 그 원인이며 특정 프로세스가 사용가능 영역 이외의 메모리 영역을 사용하거나, 허용되지 않는 값을 0 으로 나누는 등의 비정상적인 연산의 결과로서 메모리의 사용에 문제가 발생하였음을 알리는 메시지 입니다.
이런 경우에 “segmentaion fault”를 유발시킨 특정 프로세스를 종료하기 위해 kill 명령어로 시그널 11번(SIGSEGV)을 보내서 종료하도록 해야 한다.