Child pages
  • Unix, Linux 에서 kill 명령어로 안전하게 프로세스 종료 시키는 방법

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

검색을 해 보니 거의 모든 블로그가 프로세스 종료를 -9 signal 로 처리하라고 되어 있어서 kill 명령의 의미 및 안전하게 프로세스 종료 하는 법을 정리해 본다.


kill 명령어

kill 은 용도에 맞지 않게 이름이 지어진 명령어중의 하나이다. 하나로 주요 용도는 event 가 발생했음을 프로세스에게 알리는 것이다.

프로그래밍을 할때 참고할 수 있는 signal 의 종류는 /usr/include/signal,.h 에 정리되어 있다. (실제 선언부는 OS 의 종류에 따라 signal.h 에서 별도로 include 할 수도 있다)

또는 다음 명령으로 시그널 목록을 확인할 수 있음. 


Code Block
$ 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



Un*x 는 프로그램에서 signal 종류 별로 signal handler 를 지정할 수 있는데 유일하게 handler 를 지정할수 없는 시그널은 SIGKILL(9), SIGSTOP(19) 두 개의 시그널이다.

...

제대로 구현한 프로그램이라면 종료의 의미로 사용되는 signal (INT, HUP, TERM 등)을 받으면 resource 를 정리하는 cleanup 코드를 실행하고 종료하게 되어 구현되어 있을 것이다.

프로세스 종료시 kill -9 PID 를 권장하는 않는건 제대로 signal handler 를 구현한 프로그램이라도 cleanup 작업을 하지 못하고 바로 종료되어 버릴수 있기 때문이다.

...

Code Block
languagebash
title위 쓰레드에서 발췌한 killtree.sh
#!/bin/bash

killtree() {
    local _pid=$1
    local _sig=${2:-TERM}
    kill -stop ${_pid} # needed to stop quickly forking parent from producing child between child killing and parent killing
    for _child in $(ps -o pid --no-headers --ppid ${_pid}); do
        killtree ${_child} ${_sig}
    done
    kill -${_sig} ${_pid}
}

if [ $# -eq 0 -o $# -gt 2 ]; then
    echo "Usage: $(basename $0) <pid> [signal]"
    exit 1
fi

killtree $@


같이 보기