기본 문법
kill [-시그널] PID...
kill은 지정한 PID의 프로세스에 시그널(signal)을 전달하는 명령어입니다. 이름과 달리 종료 전용 도구가 아니라 종료·중지·재개·설정 재읽기 등 여러 신호를 보내는 데 쓰입니다. 기본값은 15번 SIGTERM으로, 프로세스가 정리 작업을 마치고 스스로 끝나도록 요청하는 정상 종료 신호입니다.
실무에서는 응답이 없는 서비스나 장시간 점유 중인 프로세스를 정리할 때 씁니다. 순서는 보통 SIGTERM을 먼저 보내고, 일정 시간 기다린 뒤에도 남아 있으면 SIGKILL(9)로 강제 종료합니다. SIGKILL은 프로세스가 가로챌 수 없어 확실히 끝나지만, 임시 파일이나 데이터가 정리되지 않은 채 남을 수 있어 최후의 수단으로 둡니다.
Rocky Linux 8에서는 셸 내장 kill(bash 4.4)과 /usr/bin/kill(util-linux 2.32)이 함께 제공되며, 대화형 셸에서는 내장 kill이 먼저 쓰입니다. 작업 번호(%1) 지정은 내장 kill에서만 동작합니다.
리눅스마스터·LPIC 시험에서는 시그널 번호와 이름의 대응(15=TERM, 9=KILL, 1=HUP, 2=INT, 19=STOP, 18=CONT)을 묻는 문제가 자주 나옵니다. 실습에서도 PID 파일을 읽어 종료한 뒤 결과를 기록하는 형태로 ps, pgrep과 함께 다뤄집니다.
자주 쓰는 옵션
| 옵션 | 의미 | 예 |
|---|---|---|
(옵션 없음) | 기본 SIGTERM(15) 전송, 정상 종료 요청 | kill 1234 |
-9 | SIGKILL 전송, 프로세스가 가로챌 수 없는 강제 종료 | kill -9 1234 |
-15 | SIGTERM 전송(기본값과 동일), 정상 종료 요청 | kill -15 1234 |
-l [시그널] | 시그널 목록 출력. 번호나 이름을 인자로 주면 서로 변환 | kill -l 9 |
-s 시그널 | 보낼 시그널을 이름 또는 번호로 지정 | kill -s TERM 1234 |
-SIGNAL | 시그널 이름으로 지정(SIG 접두어 생략 가능) | kill -TERM 1234 |
-1 (-HUP) | SIGHUP 전송. 일부 데몬이 설정 파일 재읽기 신호로 사용(데몬마다 동작이 다름) | kill -HUP 1234 |
-19 (-STOP) / -18 (-CONT) | SIGSTOP으로 일시 중지, SIGCONT로 재개. 번호는 아키텍처에 따라 다를 수 있어 이름 사용을 권장 | kill -STOP 1234; kill -CONT 1234 |
-0 | 시그널을 보내지 않고 프로세스 존재 여부와 시그널 전송 권한만 확인 | kill -0 1234 |
%작업번호 | 셸의 작업(job) 번호로 지정. bash 내장 kill에서만 동작하며 /usr/bin/kill에서는 쓸 수 없음 | kill %1 |
실무 예시
시그널 목록과 번호 확인
$ kill -l 9; kill -l TERM
KILL
15
시그널 번호와 이름을 서로 변환합니다. 9는 KILL, TERM은 15임을 확인할 수 있습니다.
백그라운드 프로세스를 기본 시그널로 종료
준비: mkdir -p /tmp/demo; cd /tmp/demo
$ sleep 300 & PID=$!; kill $PID; sleep 1; ps -p $PID > /dev/null && echo "alive" || echo "stopped=$PID"
bash: line 2: 29 Terminated sleep 300
stopped=29
옵션 없이 kill을 쓰면 SIGTERM이 전달되어 sleep 프로세스가 정상 종료됩니다. 대화형 셸에서는 작업 제어 알림('Terminated')이 별도 줄로 함께 출력될 수 있으며, PID 값은 실행할 때마다 달라집니다.
PID 파일을 읽어 SIGTERM으로 종료하고 결과 기록
준비: mkdir -p /tmp/demo/proc; sleep 300 & echo $! > /tmp/demo/proc/target.pid
$ kill -15 $(cat /tmp/demo/proc/target.pid); sleep 1; echo "stopped=$(cat /tmp/demo/proc/target.pid)" > /tmp/demo/proc/result.txt; cat /tmp/demo/proc/result.txt
bash: line 2: 39 Terminated sleep 300
stopped=39
PID 파일에 기록된 PID를 읽어 SIGTERM으로 종료한 뒤, 종료한 PID를 결과 파일에 남깁니다. 셸의 작업 제어 알림이 함께 출력될 수 있습니다.
-0으로 생존 확인 후 SIGKILL 폴백
준비: mkdir -p /tmp/demo; sleep 300 & echo $! > /tmp/demo/t.pid
$ P=$(cat /tmp/demo/t.pid); kill -TERM $P; sleep 2; kill -0 $P 2>/dev/null && kill -9 $P; echo "killed=$P"
bash: line 2: 53 Terminated sleep 300
killed=53
SIGTERM을 보낸 뒤 kill -0으로 생존 여부를 검사하고, 남아 있으면 SIGKILL로 강제 종료하는 패턴입니다. 이 예시의 sleep은 SIGTERM에서 바로 종료되므로 SIGKILL 단계는 실행되지 않습니다.
같은 이름 프로세스 중 가장 오래된 것만 종료
준비: mkdir -p /tmp/demo; for i in 1 2 3; do sleep 300 & sleep 0.3; done
$ P=$(pgrep -o -x -P $$ sleep); kill $P; sleep 1; echo $P; pgrep -x -P $$ sleep | wc -l
bash: line 2: 64 Terminated sleep 300
64
2
pgrep -o는 조건에 맞는 프로세스 중 가장 먼저 시작된 하나의 PID만 출력합니다. -P $$로 현재 셸이 띄운 자식으로 범위를 좁혀야 컨테이너의 PID 1이나 다른 사용자의 sleep까지 잡히는 사고를 막을 수 있습니다. 남은 개수로 하나만 종료됐음을 확인합니다.
프로세스 중지와 재개
$ sleep 60 & P=$!; kill -STOP $P; ps -o pid,stat -p $P --no-headers; kill -CONT $P; ps -o pid,stat -p $P --no-headers; kill -9 $P
80 T
80 S
SIGSTOP을 보내면 STAT가 T(중지)로, SIGCONT를 보내면 S(대기)로 바뀝니다. cmd 열은 환경에 따라 '/usr/bin/coreutils --coreutils-prog-shebang=sleep ...'처럼 실제 실행 경로가 표시될 수 있어 여기서는 pid와 stat만 출력합니다.
주의할 점
- kill -9를 먼저 쓰면 프로세스가 정리 작업을 못 합니다. SIGTERM을 먼저 보내고 남을 때만 -9를 씁니다.
- kill은 PID를 받습니다. 프로세스 이름을 그대로 넣으면 동작하지 않으므로 pgrep으로 PID를 구하거나 pkill을 씁니다.
- SIGTERM 직후 바로 확인하면 아직 살아 있을 수 있습니다. 1~2초 기다린 뒤 kill -0으로 검사하세요.
- pgrep -o는 시스템 전체에서 가장 오래된 프로세스를 고르므로, 컨테이너의 PID 1이나 다른 사용자의 동명 프로세스가 선택될 수 있습니다. -P, -u, -x 등으로 대상 범위를 반드시 좁히세요.
- 다른 사용자의 프로세스는 root가 아니면 종료할 수 없어 'Operation not permitted'가 발생합니다.
- PID 1(init/systemd 또는 컨테이너 주 프로세스)이나 커널 스레드에 시그널을 보내면 시스템이나 컨테이너가 중단될 수 있으니, 종료 전 ps로 대상 PID를 반드시 확인하세요.
- SIGSTOP으로 중지한 프로세스는 스스로 깨어나지 못합니다. 반드시 SIGCONT로 재개해야 하며, 중지 상태로 방치하면 잠금이나 자원을 계속 점유할 수 있습니다.
이 명령어로 풀 수 있는 실습 문제
브라우저 웹 터미널에서 바로 풀고 요구사항별로 자동 채점됩니다. 로그인 없이 5분 체험도 가능합니다.
관련 명령어
마지막 검수 2026-09-16 · 내용에 오류가 있으면 문제 페이지의 질문 기능으로 알려 주세요.
