Linux 서버를 운영하다 보면 ps 명령어를 실행했을 때 Z 또는 defunct 상태의 프로세스를 발견하는 경우가 있습니다. 이를 Zombie Process(좀비 프로세스)라고 합니다.
Zombie Process는 이미 실행이 끝난 프로세스이지만 부모 프로세스가 종료 정보를 회수하지 않아 프로세스 목록에 남아 있는 상태입니다. 일반적으로 CPU나 메모리를 거의 사용하지는 않지만, 계속 증가하면 시스템 자원을 낭비하고 비정상적인 프로그램 동작을 의미할 수 있습니다.
이번 글에서는 Zombie Process가 무엇인지, 발생 원인과 확인 방법, 그리고 해결 방법까지 자세히 알아보겠습니다.
Zombie Process란 무엇인가?
Zombie Process는 실행이 종료되었지만 부모 프로세스가 종료 상태를 읽지 않아 프로세스 테이블에 남아 있는 프로세스입니다.
실제 프로그램은 종료되었지만 PID(Process ID)는 계속 유지됩니다.
프로세스 상태에서는 다음과 같이 표시됩니다.
- Z
- defunct
이 상태가 바로 Zombie Process입니다.
Zombie Process가 발생하는 대표적인 원인
다음과 같은 경우 Zombie Process가 발생할 수 있습니다.
- 부모 프로세스의 프로그램 오류
- wait() 함수 미호출
- 자식 프로세스 종료 처리 실패
- 프로그램 버그
- 비정상적인 프로세스 종료
- 오래 실행되는 서비스 오류
- 잘못 작성된 Shell Script
대부분 부모 프로세스의 종료 처리 문제로 발생합니다.
1. Zombie Process 확인하기
가장 먼저 Zombie Process가 존재하는지 확인합니다.
ps -el | grep Z
또는
ps aux | grep defunct
Zombie 상태의 프로세스를 쉽게 확인할 수 있습니다.
2. 프로세스 상태 확인하기
특정 프로세스의 상태를 확인합니다.
ps -o pid,ppid,state,cmd -p PID
State 항목이 Z라면 Zombie Process입니다.
3. 부모 프로세스 확인하기
Zombie Process의 부모 프로세스를 확인합니다.
ps -fp PPID
부모 프로세스를 확인하는 것이 가장 중요합니다.
4. 프로세스 트리 확인하기
프로세스 관계를 트리 형태로 확인합니다.
pstree -p
Zombie Process와 부모 프로세스의 관계를 쉽게 확인할 수 있습니다.
5. 부모 프로세스 정보 확인하기
부모 프로세스가 정상적으로 실행 중인지 확인합니다.
ps -fp PPID
부모 프로세스가 비정상 상태라면 종료 처리가 이루어지지 않을 수 있습니다.
6. systemd 서비스인지 확인하기
서비스에서 발생한 경우 어떤 서비스인지 확인합니다.
systemctl status 서비스명
서비스 로그도 함께 확인하는 것이 좋습니다.
7. 시스템 로그 확인하기
관련 오류 메시지를 확인합니다.
journalctl -xe
또는
dmesg
프로세스 오류나 서비스 오류가 발생했는지 확인합니다.
8. 부모 프로세스 재시작하기
Zombie Process는 직접 종료되지 않습니다.
부모 프로세스를 재시작하면 대부분 자동으로 정리됩니다.
예를 들어 서비스를 재시작하는 경우입니다.
systemctl restart 서비스명
운영 환경에서는 서비스 영향도를 반드시 확인한 후 진행해야 합니다.
9. 부모 프로세스 종료하기
필요하다면 부모 프로세스를 종료할 수도 있습니다.
kill PID
또는 강제 종료가 필요한 경우
kill -9 PID
무조건 강제 종료하기보다 서비스 영향을 먼저 검토해야 합니다.
10. Zombie Process가 계속 발생하는 경우
동일한 프로그램에서 Zombie Process가 반복된다면 프로그램 자체의 버그일 가능성이 높습니다.
이 경우에는 프로그램 업데이트 또는 개발 코드 수정이 필요할 수 있습니다.
Zombie Process 확인 순서
실무에서는 다음 순서대로 확인하는 것이 가장 효율적입니다.
- ps -el | grep Z
- ps aux | grep defunct
- ps -o pid,ppid,state,cmd
- 부모 프로세스 확인
- pstree
- systemctl status
- journalctl
- 부모 프로세스 재시작
- 필요 시 부모 프로세스 종료
- 프로그램 업데이트 여부 확인
Zombie Process를 확인할 때 주의할 점
Zombie Process는 CPU와 메모리를 거의 사용하지 않기 때문에 급하게 종료할 필요는 없습니다.
하지만 Zombie Process가 계속 증가한다면 부모 프로세스의 종료 처리에 문제가 있다는 의미이므로 반드시 원인을 확인해야 합니다.
또한 Zombie Process 자체는 kill 명령으로 제거되지 않습니다. 부모 프로세스가 종료 상태를 회수하거나 부모 프로세스가 종료되어야 정상적으로 사라집니다.
자주 묻는 질문
Zombie Process는 메모리를 많이 사용하나요?
아닙니다.
실행은 이미 종료되었기 때문에 CPU와 메모리는 거의 사용하지 않습니다.
Zombie Process를 kill 하면 없어지나요?
아닙니다.
이미 종료된 프로세스이므로 kill 명령으로 제거되지 않습니다.
Zombie Process가 많으면 문제가 되나요?
소수는 큰 문제가 아니지만 지속적으로 증가한다면 부모 프로세스의 버그나 프로그램 오류를 의심해야 합니다.
마무리
Zombie Process는 실행이 끝났지만 부모 프로세스가 종료 상태를 회수하지 않아 남아 있는 프로세스입니다. CPU나 메모리를 많이 사용하지는 않지만 반복적으로 발생한다면 애플리케이션이나 서비스에 문제가 있을 가능성이 높습니다. ps, pstree, journalctl, systemctl 등을 활용하여 부모 프로세스를 확인하고 근본 원인을 해결하는 것이 가장 중요합니다.