La foret rouge

Linux 서버에서 프로세스 강제 종료하는 방법

Published on
Published on
Authors
  • avatar
    Name
    신주용

리눅스 운영체제에서 때때로 프로세스가 응답하지 않거나 자원을 갑자기 많이 쓰는 등의 이유로 강제로 종료해야 할 때가 있습니다. 이 때는 kill 명령어를 사용하면 프로세스를 강제로 종료할 수 있습니다. 이번 글에서는 kill 명령어를 사용하는 방법과 SIGTERM, SIGKILL 시그널에 대해 간단히 소개합니다.

kill 명령어 사용 방법

종료할 프로세스의 PID 찾기

리눅스에서 kill 명령어는 특정한 시그널을 프로세스에 보내 종료를 요청하는 역할을 합니다. 이 때 종료할 프로세스의 PID(Process ID)가 필요합니다. 예를 들어 python으로 8080번 포트를 사용하는 웹서버 프로세스를 찾으려면 아래와 같이 실행합니다.

# ps -ef | grep <str_to_find>
> ps -ef | grep python
UID          PID    PPID  C STIME TTY          TIME CMD
refo        6114    6041  0 16:44 pts/2    00:00:00 python3 -m http.server 8080

> ps -ef | grep 8080
UID          PID    PPID  C STIME TTY          TIME CMD
refo        6114    6041  0 16:44 pts/2    00:00:00 python3 -m http.server 8080

여기서 두 번째 열 PID값(이 예시에서는 6114)을 기억해둡니다.

SIGTERM으로 종료 시도

일반적으로 프로세스를 종료할 때는 SIGTERM(시그널 번호 15번)을 사용합니다. kill 명령어는 시그널을 명시하지 않으면 기본적으로 이 시그널을 사용합니다1.

# kill <pid>[, ..., pidN]
# kill -15 <pid>[, ..., pidN]
> kill -15 6114
# 출력 없음
> python3 -m http.server 8080
Serving HTTP on 0.0.0.0 port 8080 (http://0.0.0.0:8080/) ...
127.0.0.1 - - [02/Mar/2025 16:44:22] "GET / HTTP/1.1" 200 -
종료됨

SIGKILL으로 종료 시도

대부분의 프로세스는 SIGTERM 시그널을 받으면 안전하게 종료됩니다. 그러나 프로세스가 시그널을 무시하거나 응답하지 않는 경우 더 강제적인 방법을 사용해야 합니다.

# kill -9 <pid>[, ..., pidN]
> kill -15 6114
# 출력 없음
> python3 -m http.server 8080
Serving HTTP on 0.0.0.0 port 8080 (http://0.0.0.0:8080/) ...
127.0.0.1 - - [02/Mar/2025 19:10:28] "GET / HTTP/1.1" 200 -
죽었음
  • ⚠️ 참고: 이 예시의 경우 '종료됨'과 '죽었음'이라고 출력이 다르게 나옵니다. 하지만 이는 pythonhttp.server에서만 이렇게 동작하는 것일 뿐 다른 파이썬 웹서버, 다른 언어를 사용한다면 출력이 이렇게 구분되지 않을 수 있습니다.

SIGTERMSIGKILL의 차이점

SIGTERM은 프로세스가 정상적인 종료 과정을 거칠 기회를 주는 방법입니다. 프로세스는 이 시그널을 받으면 리스너/핸들러를 통해 정리 작업을 수행하고 자원을 해제한 후 종료할 수 있으며, 어떤 경우에는 이 시그널을 무시하도록 구현할 수도 있습니다. 이런 과정을 거치기 때문에 비교적 안전하게 종료할 수 있습니다23.

반면 SIGKILL의 경우 프로세스는 이 시그널을 감지하거나 처리할 수 없으며 즉시 종료됩니다. 때문에 정리 작업이나 자원 해제도 할 수 없어 데이터 손실이나 자원 누수가 발생할 수 있습니다23.

따라서 일반적으로 SIGTERM으로 먼저 종료를 시도한 후 프로세스가 반응하지 않을 때 SIGKILL을 사용하는 것이 좋습니다.

참고: 이 글에서 언급되었으나 깊게 설명하지 않은 내용입니다.

  • Linux Signals
  • PID (Process ID)

Footnotes

  1. "kill(1) - Linux Man page." die.net. https://linux.die.net/man/1/kill (accessed Mar. 2, 2025).

  2. Divya Kiran Kumar. "The ABCs of Linux Signals: SIGINT, SIGTERM, and SIGKILL explained." FOSS Linux. https://www.fosslinux.com/121761/the-abcs-of-linux-signals-sigint-sigterm-and-sigkill-explained.htm (accessed Mar. 2, 2025). 2

  3. Abhishek Prakash. "SIGTERM vs SIGKILL: What's the Difference?" Linux Handbook. https://linuxhandbook.com/sigterm-vs-sigkill/ (accessed Mar. 2, 2025). 2