Linux의 좀비 프로세스: 찾기, 제거, 방지

15분 소요 - 2026년 5월 19일

hero section cover
목차
  • 리눅스의 좀비 프로세스: 찾고 제거하는 방법
  • 서버에서 좀비 프로세스가 중요한 이유
  • 좀비 프로세스 찾는 방법
  • 좀비 프로세스 제거 방법
  • 좀비 프로세스 방지
  • 결론
공유

Linux에서 좀비 프로세스를 식별, 제거 및 방지하는 방법에 대해 알아보세요. 서버 관리자를 위한 명령어, 코드 수정 및 모니터링 팁.

리눅스의 좀비 프로세스: 찾고 제거하는 방법

좀비 프로세스(zombie process)는 실행을 완료했지만 여전히 커널의 프로세스 테이블에서 슬롯을 차지하고 있는 자식 프로세스입니다. 이는 부모 프로세스가 wait() 하여 종료 상태를 수신하지 않았기 때문에 존재합니다. 좀비 프로세스는 CPU나 메모리를 소비하지는 않지만, 각각 PID를 차지하고 있습니다. 이들이 충분히 쌓이면 시스템에서 새로운 프로세스를 생성할 수 없게 됩니다. 이 글에서는 좀비 프로세스를 식별하고 제거하며, 애초에 발생하지 않도록 방지하는 방법을 다룹니다.


 

서버에서 좀비 프로세스가 중요한 이유

단일 좀비 프로세스는 무해합니다. 문제는 이들이 쌓이기 시작할 때 발생합니다. 리눅스는 유한한 PID 공간을 가지고 있습니다: 32비트 시스템에서는 32,768개, 64비트 시스템에서는 최대 4,194,304개입니다. 좀비 프로세스가 프로세스 테이블을 가득 채우면 커널은 새로운 프로세스를 생성할 수 없습니다. 이는 새로운 연결, 새로운 작업자 스레드, 그 어떤 새로운 것도 생성할 수 없음을 의미합니다.

아파치(Apache)나 엔진엑스(Nginx)와 같은 웹 서버는 트래픽을 처리하기 위해 자식 프로세스를 포크(fork)하기 때문에 특히 취약합니다. 벤치마크 결과, 트래픽이 많은 웹 서버에서 좀비 프로세스가 쌓이면 처리량이 48% 감소하는 것으로 나타났습니다. 2019년에는 쿠버네티스(Kubernetes) DNS 포드에서 발생한 Go 언어 채널 누수로 인해 단일 노드에 26,000개 이상의 좀비 프로세스가 생성되어 프로세스 테이블을 가득 채웠고, 이로 인해 클러스터 전체의 DNS 조회 기능이 중단되었습니다.

아래 표는 일반 프로세스와 좀비의 주요 차이점을 보여줍니다:

특징일반 프로세스좀비 프로세스
상태 기호R, S, D 또는 TZ (종료됨)
CPU / 메모리활성 사용량0% / 0 (이미 종료됨)
프로세스 테이블 항목슬롯 1개슬롯 1개
다음에 대한 응답 kill -9즉시 종료효과 없음 (이미 종료됨)
커널 메모리전체 프로세스 디스크립터최소 종료 상태만

핵심 요점: 좀비를 kill -9 좀비 프로세스를 종료할 수 없습니다. 이미 죽은 상태이기 때문입니다. 이를 정리하는 유일한 방법은 부모 프로세스가 이를 회수하도록 하거나, 부모 프로세스를 종료하여 init (PID 1)이 이를 상속받아 자동으로 정리하도록 하는 것뿐입니다.

좀비 프로세스 찾는 방법

좀비 프로세스는 STAT 열에 Z가 표시되고 <defunct> 명령어 이름 옆에 표시됩니다. 다음 명령어로 목록을 확인하세요:

ps aux | grep -w Z

제거에 필요한 부모 프로세스 ID(PPID)를 확인하려면:

ps -eo pid,ppid,stat,comm | grep -w Z

top 명령어는 헤더 줄에 전체 좀비 프로세스 수를 표시합니다. 비대화형으로 빠르게 확인하려면:

top -bn1 | grep zombie

pstree를 사용하여 부모 프로세스 추적하기

좀비의 PID를 확인했다면, 이를 추적하여 해당 프로세스를 생성한 부모 프로세스를 찾아보세요:

pstree -p -s <zombie_pid>

이 명령은 init 좀비 프로세스까지의 전체 계보를 보여줍니다. 만약 pstree 가 설치되어 있지 않다면, ps auxf 와 유사한 ASCII 트리 뷰를 제공합니다.

모니터링을 위한 좀비 카운트

grep 프로세스 자체를 제외한 정확한 개수:

ps aux | awk '$8 ~ /Z/ {count++} END {print count+0}'

문제 해결 중 지속적인 모니터링을 위해:

watch -n 1 'ps aux | grep -w Z | wc -l'

좀비 프로세스 제거 방법

좀비 프로세스는 종료 상태를 수집해야만 제거할 수 있습니다. 즉, 부모 프로세스를 통해 처리해야 합니다.

1. 부모 프로세스를 찾습니다.

ps -o ppid= -p <zombie_pid>

2. 부모 프로세스에 자식 프로세스를 정리하도록 신호를 보냅니다.

kill -SIGCHLD <parent_pid>

이렇게 하면 부모 프로세스가 wait() 호출하도록 지시합니다. 이는 시스템 운영에 지장을 주지 않으며, 정상적으로 동작하는 애플리케이션에서는 효과적입니다.

3. SIGCHLD 신호가 작동하지 않으면 서비스를 재시작합니다.

systemctl restart <service_name>

4. 부모 프로세스가 응답하지 않으면 강제 종료합니다.

kill <parent_pid>

또는 SIGTERM 신호를 무시할 경우:

kill -9 <parent_pid>

부모 프로세스가 종료되면, init (PID 1) 또는 systemd 고아 좀비 프로세스를 양육하여 즉시 정리하십시오. 운영 환경에서는 주의하십시오. 부모 프로세스를 종료하면 모든 활성 자식 프로세스도 함께 종료됩니다.

5. 정리 작업을 확인하십시오.

ps aux | awk '$8 ~ /Z/ {count++} END {print count+0}'

카운트가 0이면 문제가 없습니다.

좀비 프로세스 방지

코드에서 자식 프로세스 처리하기

대부분의 좀비 프로세스 축적의 근본 원인은 wait(). 근본적인 원인을 해결하십시오:

  • C: signal(SIGCHLD, SIG_IGN); 를 설정하여 자식 프로세스의 종료 정보를 자동으로 버리거나, waitpid(-1, NULL, WNOHANG) 를 사용하여 비동기적으로 정리하십시오.
  • Python: subprocess.run()를 사용하십시오. 이는 자동으로 대기합니다. Popen를 사용하는 경우 proc.wait() 를 명시적으로 호출하십시오.
  • Bash: 백그라운드 작업을 시작하는 스크립트의 wait 백그라운드 작업을 실행하는 스크립트의 끝에 추가하십시오.

systemd를 올바르게 구성하십시오

systemd가 관리하는 서비스의 경우, 다음 설정은 좀비 프로세스 축적을 방지합니다:

  • KillMode=control-group 서비스가 중지될 때 모든 자식 프로세스가 함께 종료되도록 보장합니다.
  • TimeoutStopSec systemd가 SIGKILL 신호를 보내기 전에 부모 프로세스가 자식 프로세스를 정리할 시간을 줍니다.
  • WatchdogSec 응답이 없는 서비스를 자동으로 재시작하여, 부모 프로세스가 멈춰서 자식 프로세스 수거를 중단하는 경우를 처리합니다.

프로세스 테이블 모니터링

15분마다 실행되는 cron 작업을 설정하여 좀비 프로세스 수를 집계하고, 수치가 임계값을 초과할 경우 알림을 전송합니다:

ps aux | awk '$8 ~ /Z/' | wc -l

또한 현재 수치를 /proc/sys/kernel/pid_max. 80%를 초과하면 문제가 되기 전에 조사하십시오. 정상 작동 중 일시적으로 발생하는 소수의 좀비는 걱정할 필요가 없습니다. 0으로 돌아가지 않고 계속 증가하는 수는 수정해야 할 애플리케이션 버그를 나타냅니다.

결론

좀비 프로세스는 정리되지 않은 죽은 자식 프로세스입니다. 이들은 CPU나 메모리를 사용하지는 않지만 PID를 점유하고 있으며, 프로세스 테이블이 가득 차면 서버가 유용한 작업을 수행할 수 없게 됩니다.

  • 다음 명령어로 이를 찾아 ps aux | grep -w Z 를 사용하여 찾아내고, pstree.
  • 다음 명령을 사용하여 제거하십시오 SIGCHLD 를 부모 프로세스에 보내거나, 서비스를 재시작하거나, 최후의 수단으로 부모 프로세스를 종료하여 제거하십시오.
  • 다음과 같은 코드를 작성하여 이를 방지하십시오 wait()를 호출하고, systemd를 올바르게 구성하며, 프로세스 테이블을 모니터링하여 이를 방지하십시오.

트래픽이 많은 워크로드를 실행 중이고 완전한 루트 액세스 권한이 있는 안정적인 인프라가 필요하다면, FDC의 전용 서버를 통해 프로세스 관리 및 시스템 구성을 완벽하게 제어할 수 있습니다.

블로그

이번 주 추천

더 많은 기사
Linux의 좀비 프로세스: 찾기, 제거, 방지

Linux의 좀비 프로세스: 찾기, 제거, 방지

Linux에서 좀비 프로세스를 식별, 제거 및 방지하는 방법에 대해 알아보세요. 서버 관리자를 위한 명령어, 코드 수정 및 모니터링 팁.

15분 소요 - 2026년 5월 19일

Linux 서버 강화 체크리스트

15분 소요 - 2026년 5월 8일

더 많은 기사
background image

질문이 있거나 맞춤형 솔루션이 필요하신가요?

icon

유연한 옵션

icon

글로벌 도달 범위

icon

즉시 배포

icon

유연한 옵션

icon

글로벌 도달 범위

icon

즉시 배포