본문으로 바로가기
TaeyoungKim.dev

리눅스 kill과 kill -9 차이: 프로세스 종료 전에 확인할 것

리눅스작성 약 3분 읽기TaeyoungKim
LinkedInX

프로그램이 끝나지 않으면 kill -9부터 입력하고 싶어진다. 빠른 해결처럼 보이지만, 종료하면서 파일을 닫거나 진행 중인 작업을 정리할 기회까지 없앨 수 있다. 먼저 누구에게 신호를 보낼지, 그리고 종료가 실제로 끝났는지 확인하자.

kill과 kill -9는 어떻게 다를까?

kill PID는 기본적으로 SIGTERM을 보낸다. 프로그램에 종료를 요청하는 신호다. 프로그램이 이를 처리하도록 작성됐다면 정리 작업을 한 뒤 끝날 수 있다. 처리하지 않으면 기본 동작에 따라 종료한다. TERM을 보냈다고 정리 코드가 저절로 생기지는 않는다.

kill -9 PID는 SIGKILL을 보낸다. 이 신호는 프로그램이 잡거나 무시할 수 없어 자체 정리 코드를 실행할 기회가 없다. Linux signal(7)은 이 차이와 각 신호의 기본 동작을 명시한다.

내 프로세스에서 종료 결과를 어떻게 확인할까?

아래 예제는 잠깐 기다리는 Bash 작업을 직접 시작한 뒤 그 PID만 종료한다. worker.ready 파일은 작업이 시작됐는지 확인하는 표시다. 실행 중인 다른 프로그램의 PID를 가져오지 않는다.

bash
lab_dir=$(mktemp -d) || exit 1

worker() {
  label=$1
  trap 'printf "cleanup\n" >> "$lab_dir/$label.log"; exit 0' TERM
  : > "$lab_dir/$label.ready"
  while :; do sleep 0.1; done
}

run_case() {
  label=$1
  signal=$2
  worker "$label" &
  worker_pid=$!

  for attempt in 1 2 3 4 5 6 7 8 9 10; do
    [ -e "$lab_dir/$label.ready" ] && break
    sleep 0.05
  done
  [ -e "$lab_dir/$label.ready" ] || return 3

  ps -p "$worker_pid" -o pid=,stat=,comm=
  kill -"$signal" "$worker_pid"
  wait "$worker_pid" 2>/dev/null
  status=$?

  if [ -s "$lab_dir/$label.log" ]; then
    printf '%s: status=%s, cleanup=yes\n' "$label" "$status"
  else
    printf '%s: status=%s, cleanup=no\n' "$label" "$status"
  fi
}

run_case term TERM
run_case kill KILL

실행한 Bash에서는 다음처럼 나왔다. PID 숫자는 실행할 때마다 달라진다.

text
4809 S    bash
term: status=0, cleanup=yes
4813 S    bash
kill: status=137, cleanup=no

$!는 방금 시작한 백그라운드 작업의 PID다. ps에서 본 S는 잠시 기다리는 상태이며, 화면에 남아 있다는 이유만으로 고장이라고 볼 수 없다. TERM을 받은 작업은 trap에서 정리 기록을 남기고 exit 0을 실행했다. KILL을 받은 작업에는 그 기록이 없다. 여기서 137은 이 Bash 실행의 종료 상태이며 모든 프로그램의 성공·실패를 판정하는 고정 숫자로 쓰면 안 된다.

kill 명령이 성공했는데 왜 다시 확인해야 할까?

kill의 성공은 신호를 보내는 요청이 받아들여졌다는 뜻이다. 정리가 끝났다는 확인은 아니다. 예제의 wait는 현재 셸이 시작한 자식 작업이 끝날 때까지 기다린다. 다른 셸이나 서비스가 시작한 프로세스에 같은 wait를 붙일 수는 없다.

운영 중인 프로세스라면 ps에서 PID뿐 아니라 명령과 실행 사용자를 확인하고, 서비스 관리자와 로그에서 종료 상태를 본다. 오래 적어 둔 PID는 이미 다른 프로세스에 재사용됐을 수도 있다. 숫자만 믿고 신호를 보내면 엉뚱한 집 초인종을 누르는 셈이다.

TERM 뒤에도 끝나지 않을 때는 프로그램이 신호를 처리하는지, 정리 작업이 진행 중인지, 서비스가 재시작했는지를 먼저 살핀다. 허용한 종료 시간을 넘긴 뒤에야 강제 종료와 복구 방법을 함께 판단한다.

핵심 요약

kill은 종료를 요청하고, kill -9는 프로그램의 정리 기회 없이 강제 종료한다. 대상의 PID·명령·관리 주체를 확인한 뒤 TERM을 보내고, 실제 종료와 정리 결과를 확인하자. KILL은 제한 시간을 넘긴 뒤 복구 영향을 판단할 때 사용한다.

작성자

TaeyoungKim

기초 개념을 구현과 검증, 실제 운영 판단까지 연결해 기록합니다.

#Linux#kill 명령어#kill -9#SIGTERM#SIGKILL

함께 읽으면 좋은 글