Linux 서버에서 프로세스 강제 종료하는 방법
- Published on
- Published on
- Authors
- 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 -
죽었음
- ⚠️ 참고: 이 예시의 경우 '종료됨'과 '죽었음'이라고 출력이 다르게 나옵니다. 하지만 이는
python
의http.server
에서만 이렇게 동작하는 것일 뿐 다른 파이썬 웹서버, 다른 언어를 사용한다면 출력이 이렇게 구분되지 않을 수 있습니다.
SIGTERM
과 SIGKILL
의 차이점
SIGTERM
은 프로세스가 정상적인 종료 과정을 거칠 기회를 주는 방법입니다. 프로세스는 이 시그널을 받으면 리스너/핸들러를 통해 정리 작업을 수행하고 자원을 해제한 후 종료할 수 있으며, 어떤 경우에는 이 시그널을 무시하도록 구현할 수도 있습니다. 이런 과정을 거치기 때문에 비교적 안전하게 종료할 수 있습니다23.
반면 SIGKILL
의 경우 프로세스는 이 시그널을 감지하거나 처리할 수 없으며 즉시 종료됩니다. 때문에 정리 작업이나 자원 해제도 할 수 없어 데이터 손실이나 자원 누수가 발생할 수 있습니다23.
따라서 일반적으로 SIGTERM
으로 먼저 종료를 시도한 후 프로세스가 반응하지 않을 때 SIGKILL
을 사용하는 것이 좋습니다.
참고: 이 글에서 언급되었으나 깊게 설명하지 않은 내용입니다.
- Linux Signals
- PID (Process ID)
Footnotes
"kill(1) - Linux Man page." die.net. https://linux.die.net/man/1/kill (accessed Mar. 2, 2025). ↩
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
Abhishek Prakash. "SIGTERM vs SIGKILL: What's the Difference?" Linux Handbook. https://linuxhandbook.com/sigterm-vs-sigkill/ (accessed Mar. 2, 2025). ↩ ↩2