DevOps/Linux

[Linux] 좀비 프로세스란? ( Zombie Process, Defunct Process )

IT록흐 2025. 3. 11. 09:42
반응형

 

 

좀비 프로세스는 프로세스 테이블에 종료상태(Exit Status)로 남아있는 자식 프로세스(Child Process)를 의미한다.

 

자식 프로세스는 부모 프로세스에 의해 정리되어야 한다. 

 

부모 프로세스는 Wait 시스템 함수를 호출하여 자식 프로세스가 종료를 체크하다가,

자식프로세스가 종료되면 프로세스테이블에서 자식 프로세스를 수거(repeaed)한다.

 

그러므로

모든 프로세스는 부모 프로세스가 프로세스테이블에서 수거하기 전까지는, 종료되면 좀비 프로세스로 남아있는다. ( 수거 작업이 빠르게 진행되어 좀비프로세스 누적이 눈에 보이지 않는 것 뿐... )

 

 

좀비 프로세스 찾는 방법

#ps 명령어
ps -ef | grep defunct | grep -v grep
ps aux | egrep "Z|defunct"

#top 명령어
top -b -n 1 | grep zombie

 

 

좀비프로세스를 정리해야 하는 이유

 

프로세스가 Exit Status가 되면, 할당받은 리소스를 해제하고 프로세스 테이블에만 남아있는다. 그래서 좀비 프로세스가 늘어난다고 메모리나 CPU 같은 자원을 잡아 먹는 것은 아니다. 그러나 프로세스테이블에는 남아있어 정리하지 않으면, 적은 양의 좀비 프로세스는 문제가 되지 않지만 좀비 프로세스가 많아지면 시스템 자원을 낭비한다.

 

 

좀비프로세스가 만들어지는 이유

 

일반적으로 좀비 프로세스가 만들어지는 이유는 2가지이다. 

 

1) 부모 프로세스가 Block 되거나 hang에 걸려 멈춘 경우

 

부모 프로세스가 멈추면 자식 프로세스가 Exit Status가 되어도, Wait 시스템 함수를 호출하여 프로세스 테이블을 정리할 로직이 돌지 못한다. 그러면 프로세스 테이블에 자식 프로세스가 남아있게 되어, 좀비프로세스 상태로 남아 있는다. 

 

SIGCHLD 시그널 보내기

kill -s SIGCHLD <Parent_PID>

 

 

자식 프로세스가 종료되면 OS는 부모프로세스에게 SIGCHLD 시그널을 보낸다. 부모프로세스에 SIGCHLD 시그널을 핸들링하는 로직이 있어 Wait 함수를 SIGCHLD 핸들러에서 호출한다면 부모 프로세스는 좀비 프로세스를 정리한다.

 

 

 

부모 프로세스 종료하기

 

대부분의 경우, 부모 프로세스가 멈춘 경우 SIGCHLD 시그널을 보내도 효과가 없다.

 

이 경우 사이드 이펙트를 체크한 후 부모 프로세스를 kill 해야 한다. 부모 프로세스를 kill하면 자식 프로세스는 고아 프로세스(orphan process)가 된다. 고아 프로세스의 양육권은 init 프로세스를  넘어간다. init 프로세스는 고아 프로세스 중 Exit status인 프로세스를 정리하므로 좀비 프로세스는 제거된다.

 

 

2) 부모 프로세스 로직에 Wait 시스템 함수 호출 로직이 없는 경우

 

부모 프로세스가 멈추어 있지 않은데, 자식 프로세스를 수거하지 않는다면 고의로 수거작업은 지연시키는 작업이거나 아니면 Wait 시스템 호출 로직이 부모 프로세스에 없는 것이다. 고의가 아니라면 잘못 개발된 프로세스이므로 자식 프로세스를 수거하는 로직을 추가해야 한다. 

 

 

 

참고자료

https://en.wikipedia.org/wiki/Zombie_process

https://www.dell.com/support/kbdoc/ko-kr/000019108/%EB%A6%AC%EB%88%85%EC%8A%A4-%ED%99%98%EA%B2%BD%EC%97%90%EC%84%9C-%EC%A2%80%EB%B9%84-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EC%A2%85%EB%A3%8C

https://wildeveloperetrain.tistory.com/180

반응형

'DevOps > Linux' 카테고리의 다른 글

[Linux] CLI로 Disk의 파티션 및 파일시스템 생성하기  (0) 2025.03.13