← 아티클 목록

리눅스 좀비 프로세스 정리 — defunct·고아 프로세스 원인과 처리법

2026-08-03#linux#프로세스#트러블슈팅

ps를 봤더니 <defunct> 가 잔뜩 떠 있습니다. kill -9 를 날려도 사라지지 않습니다. 좀비 프로세스는 이미 죽었지만 부모가 종료 코드를 수거하지 않아 프로세스 테이블에만 남아 있는 상태입니다. 잡을 대상은 좀비가 아니라 그 부모입니다.

1단계 — 좀비가 있는지 확인

로컬 터미널
ps aux | grep 'Z'         # STAT 컬럼이 Z인 프로세스
ps -eo pid,ppid,stat,cmd | grep -w Z
OUTPUT
USER  PID  PPID STAT COMMAND
app  3210  2001 Z    [worker] <defunct>

STATZ, COMMAND에 <defunct> 가 붙으면 좀비입니다. 여기서 중요한 건 PPID(부모 PID)입니다.

2단계 — 왜 안 죽나

좀비는 이미 죽은 상태라 시그널을 받을 주체가 없습니다. kill -9 3210 은 무의미합니다. 자식이 종료되면 커널이 SIGCHLD를 부모에게 보내는데, 부모가 wait() 으로 종료 상태를 거두지(reap) 않으면 항목이 남습니다. 즉 부모의 버그입니다.

원인별 처리

상황원인처리
좀비 몇 개 산발적부모가 잠깐 reap 지연보통 곧 사라짐, 무시 가능
좀비가 계속 쌓임부모가 SIGCHLD 미처리부모 프로세스 재시작
부모가 PID 1(init)고아였다가 init이 입양init이 자동 reap, 방치

부모를 찾아 재시작하면 커널이 좀비를 정리합니다.

로컬 터미널
ps -o pid,cmd -p 2001     # 부모가 누구인지 확인
kill -HUP 2001            # 부모에게 재기동/리로드 신호 (서비스면 systemctl restart)

부모를 죽이면(kill 2001) 좀비는 PID 1에 입양되고, init이 즉시 reap 합니다.

고아 vs 좀비

  • 좀비(Z): 자식이 죽었는데 부모가 안 거둠 → 부모를 손봐야 함
  • 고아(orphan): 부모가 먼저 죽음 → 자식은 계속 살고, PID 1이 입양해 정상 동작

고아는 문제가 아닙니다. 쌓이는 좀비만 부모 버그 신호입니다.

순서 요약

로컬 터미널
ps -eo pid,ppid,stat,cmd | grep -w Z    # 좀비와 부모 PID 확인
ps -o pid,cmd -p <PPID>                 # 부모 정체 파악
systemctl restart <서비스>               # 부모를 재시작 → 커널이 reap

프로세스 상태(Z·S·D·R)와 시그널, 부모-자식 관계를 직접 만들어보며 익히는 실습은 리눅스 트랙에서 회원가입 없이 무료로 할 수 있습니다.