본문 바로가기
목차
shell

kill: Process에게 Signal을 보내기.

by ds31x 2025. 7. 25.
728x90
반응형

kill은 프로세스 종료와 시그널 전송에 사용되는 명령어임.

https://akaabachi.medium.com/respect-of-the-kill-how-to-properly-terminate-your-linux-processes-99f6025f2e53

0. kill 이란?

kill은 리눅스/유닉스에서 process에게 시그널(signal) 을 보내는 명령어.

 

문제는 가장 흔한 사용 사례가 process를 종료시키는 용도라서 process killer라고 생각해도 무방할 지경이지만...
실제로는 다양한 시그널을 process에게 전송할 수 있음.


1. 기본 사용법

kill [시그널] PID
  • PID: 대상 프로세스의 ID
  • 시그널: 종료 방식 지정 (생략 시 기본은 SIGTERM, 즉 15번 시그널)

 

예시:

kill 1234          # 기본 시그널(SIGTERM)로 PDF1234 프로세스 종료 요청
kill -9 1234       # 강제 종료(SIGKILL)
kill -SIGINT 1234  # SIGINT 시그널을 이름으로 지정

2. 주요 시그널 정리

번호 이름 설명
1 SIGHUP 터미널 종료 시 발생
2 SIGINT 인터럽트 요청 (Ctrl+C)
9 SIGKILL 강제 종료, 무시 불가
15 SIGTERM 정상 종료 요청 (기본값)
18 SIGCONT 일시 중단된 프로세스 재개
19 SIGSTOP 일시 정지 (Ctrl+Z와 유사)

 

쉽게 생각하면,

  • SIGTERM은 종료 요청
  • SIGKILL은 강제종료

좀더 자세한 SIGNAL에 대한 내용은 다음을 참고:

2023.10.22 - [Linux] - [Linux] SIGNAL 에 대한 요약 정리.

 

[Linux] SIGNAL 에 대한 요약 정리.

SIGNAL이란??OS (LINUX 및 UNIX계열)에서의 SIGNAL은UNIX 또는 UNIX 계열 또는 POSIX 호환 OS에서제한된 형태의 Inter-Process Communication (IPC)와비동기 event처리를 위해 사용되는독립적인 비동기적 이벤트 처리 메

ds31x.tistory.com


3. 프로세스 찾기

ps aux | grep <프로그램명>
pgrep <프로그램명>

4. 자식 프로세스를 포함한 종료

kill은 기본적으로 부모 프로세스만 종료시킴: 고아 프로세스 발생시킬 수 있음.

 

프로세스의 자식 프로세스를 함께 종료하려면 아래 두 가지 방법 중 하나를 사용할 것:

4-1. 방법 1: 자식 프로세스를 수동으로 찾아서 종료

PARENT_PID=1234
CHILD_PIDS=$(pgrep -P $PARENT_PID)

kill $CHILD_PIDS   # 자식 먼저 종료
kill $PARENT_PID   # 부모 종료

4-2. 방법 2: 프로세스 그룹 전체에 시그널 보내기

# 마이너스(-) 기호를 붙이면 PGID (Process Group ID)를 의미함
kill -TERM -1234   # 1234번 PID가 속한 그룹 전체에 SIGTERM 전송
kill -9 -1234      # 강제 종료

 

이 방법은 Shell 에서 set -m (job control 활성화)인 경우에만 안정적으로 동작.

  • job control이란 Shell이 백그라운드 작업, 포그라운드 작업, 일시 중지된 작업을 추적하고 제어하는 기능을 가리킴
  • iteractive shell에선 대부분 set -m 상태임.
  • shell script에선 기본적으로 job control이 비활성화 (set +m)이기 때문에, 명시적으로 활성화시켜야하는 경우도 존재: set -m
#!/bin/bash
set -m                     # job control 활성화
./some_background_process &
PGID=$(ps -o pgid= -p $!)  # 방금 실행된 백그라운드 프로세스의 그룹 ID
kill -TERM -$PGID          # 프로세스 그룹 전체에 시그널 전송

Examples

# 정상 종료
kill 5678

# 강제 종료
kill -9 5678

# 이름으로 지정한 시그널
kill -SIGTERM 5678
kill -SIGKILL 5678

# 자식 프로세스까지 함께 종료
CHILD_PIDS=$(pgrep -P 5678)
kill $CHILD_PIDS
kill 5678

# 또는 프로세스 그룹 전체 종료
kill -TERM -5678

관련된 명령어

명령어 설명
pkill 이름으로 프로세스 종료 (예: pkill python), 부분일치 지원
killall 전체 이름 정확히 일치하는 프로세스 종료

pkill예제

pkill python            # 이름에 'python'이 포함된 프로세스 모두 종료
pkill -f runserver      # 명령줄 전체에 'runserver' 포함된 프로세스 종료
pkill -9 -u ubuntu python  # ubuntu 사용자의 python 프로세스를 SIGKILL

killall예제

killall python          # 정확히 'python' 이름의 프로세스만 종료
killall -u ubuntu python  # ubuntu 사용자의 python 프로세스만 종료
killall -9 runserver    # 정확히 'runserver'라는 이름의 프로세스 종료

요약

상황 추천 명령
일반 종료 kill PID
강제 종료 kill -9 PID
이름으로 종료 pkill <이름>
자식 포함 종료 pgrep -P PID → 이후 자식과 부모 kill
그룹 전체 종료 kill -TERM -PID

같이보면 좋은 자료들

2023.10.22 - [Linux] - [Linux] SIGNAL 에 대한 요약 정리.

 

[Linux] SIGNAL 에 대한 요약 정리.

SIGNAL이란??OS (LINUX 및 UNIX계열)에서의 SIGNAL은UNIX 또는 UNIX 계열 또는 POSIX 호환 OS에서제한된 형태의 Inter-Process Communication (IPC)와비동기 event처리를 위해 사용되는독립적인 비동기적 이벤트 처리 메

ds31x.tistory.com

2023.10.22 - [Linux] - [Linux] 현재 shell 또는 session의 관련 process들 확인하기 : jobs

 

[Linux] 현재 shell 또는 session의 관련 process들 확인하기 : jobs

ssh등으로 접속한 이후, 수행시킨 process들을 background로 수행시키거나 할 경우 해당 terminal session (해당 terminal의 shell을 통해 수행된) 관련 processes를 확인할 필요한 경우가 있다. 이 경우, 쉽게 확인

ds31x.tistory.com

2023.08.23 - [Linux] - [Linux] 특정 process의 memory 점유율 확인하기 : ps + awk + grep

 

[Linux] 특정 process의 memory 점유율 확인하기 : ps + awk + grep

process를 확인하는 명령어 ps에서특정 process의 이름에 해당하는 row 들만을 grep으로 빼낸 다음,6번째 있는 resident set size (rss)를 awk로 뽑아내어 다 더한 후 해당 결과를 출력. 다음은 현재 동작 중인 p

ds31x.tistory.com

 

728x90