Programming/Linux

좀비 프로세스 원인과 죽이는 방법(Zombie Process)

Jan92 2022. 9. 14. 22:04

리눅스 좀비 프로세스 죽이기

개발서버를 운영하는 중에 "There are 2 zombie processes."라는 메시지를 발견했는데요.

리눅스 운영체제에서 발생할 수 있는 좀비 프로세스의 원인은 무엇인지, 죽이는 방법은 무엇인지 해결하며 정리한 내용입니다.

 

 


 

 

1. Zombie Process란?

프로세스가 종료되고 리소스는 모두 회수되었지만, 시스템 프로세스 테이블에 남아있는 defunct 상태의 프로세스'좀비 프로세스'라고 하는데요. 실행이 종료되었지만 아직 삭제되지 않은 프로세스라고 볼 수 있습니다.

 

 

 

2. 발생 원인

보통 프로세스는 exit() 시스템 함수를 호출함으로써 운영체제에게 자신의 삭제를 요청하며 종료되는데요. Process가 종료되면 사용하던 리소스는 운영체제에게 다시 회수됩니다.

그러나 이때 프로세스의 종료 상태가 저장되는 시스템 프로세스 테이블에는 해당 프로세스가 남아있는 상태인데요. 해당 프로세스는 부모 프로세스가 wait() 시스템 함수를 호출할 때까지 남아있게 됩니다.

 

다시 말하면, 프로세스 자체는 종료되었지만 부모 프로세스가 아직 wait() 시스템 함수를 호출하지 않아 시스템 프로세스 테이블에 남아있는 Process를 바로 '좀비 프로세스'라고 하는 것입니다.

 

***

모든 프로세스는 종료하게 되면 좀비 프로세스가 되지만 아주 짧은 시간 동안 머무르게 되고, 부모 프로세스가 wait() 시스템 함수를 호출하면 시스템 프로세스 테이블에 남아있던 좀비 프로세스의 데이터와 프로세스 식별자(PID)가 운영체제에 반환되는 것입니다.

 

즉, 좀비 프로세스로 계속해서 남아있다는 것은 부모가 wait() 시스템 함수를 호출하지 않아, 이미 종료된 프로세스가 시스템 프로세스 테이블에 계속해서 남아있는 것입니다. 

 

 

 

3. 좀비 프로세스는 위험한가?

Zombie Process는 이미 리소스가 반납되어 종료된 프로세스로 시스템 리소스를 소모하지 않습니다.

하지만 Zombie Process는 프로세스의 식별 값인 PID를 할당받은 상태인데요.

 

리눅스 운영체제에서는 기본적으로 32768( = 2의 15 제곱) 개의 한정된 PID를 가지며, 만약 좀비 프로세스가 빠른 속도로 쌓인다면 전체 가용한 PID 중 대부분을 좀비 프로세스가 차지하게 되어 다른 일반 프로세스의 실행을 방해하는 문제가 발생할 수 있습니다.

(소수의 좀비 프로세스가 남아있는 것은 버그지만 이것이 시스템에 큰 문제는 되지 않습니다.)

 

 

 

4. 좀비 프로세스 찾기

좀비 프로세스 찾기

$ ps -ef | grep defunct | grep -v grep
$ ps aux | egrep "Z|defunct"

Zombie Process는 위 두 가지 명령어를 통해 찾을 수 있는데요.

 

 

 

top -b -n 1 | grep zombie

프로세스 현황을 보는 top 명령어를 통해 몇 마리의 zombie가 있는지 간단하게 숫자만 파악할 수도 있습니다.

 

 

 

5. 좀비 프로세스 죽이기

Zombie Process는 이미 리소스 반환 및 기타 프로세스 종료 과정이 끝났기 때문에 kill 명령어를 사용해도 먹히지 않습니다. 따라서 다른 방법을 통해 죽여야 하는데요.

다른 방법으로는 부모 프로세스에게 SIGCHLD 시그널을 보내 자식 프로세스가 종료되었음을 알려서 좀비 프로세스를 시스템 프로세스 테이블에서 지우는 방법이 있지만, 이미 좀비 프로세스가 생겼다는 것은 자식 프로세스가 종료되었을 때 해당 기능이 동작하지 않았다는 것으로, 이 방법 역시 동작하지 않을 수 있습니다.

(SIGCHLD : signal child 자식 프로세스가 종료될 때 부모 프로세스에 통보되는 POSIX 신호)

 

이러한 이유로 결국 확실하게 좀비 프로세스를 죽이는 방법은 부모 프로세스 자체를 종료하는 것입니다.

다만, 부모 프로세스를 종료하게 되면 하위의 모든 자식 프로세스들이 종료되기 때문에 사이드 이팩트에 대한 고려가 필요합니다.

 

/*

부모 프로세스가 종료되면 좀비 프로세스는 Linux 시스템의 init 프로세스(PID = 1)의 자식으로 할당되게 되는데, init은 주기적으로 wait() 시스템 호출을 실행하여 좀비가 된 자식 프로세스들을 정리하게 됩니다.

*/

 

 

 

< 참고 자료 >

 

[Linux] 좀비 프로세스 죽이기

좀비 프로세스란? 자식 프로세스가 exit 시스템 콜을 호출하여 종료 되면 프로세스에 관련된 모든 리소스가 해제되어 다른 프로세스에서 사용 할 있게 되지만, 자식 프로세스가 종료 되더라도 부

kukuta.tistory.com

 

 

좀비 프로세스와 고아 프로세스 | 개발자 이동욱

좀비(zombie) 프로세스란 프로세스가 종료 될 때, 마지막 문장의 실행을 끝내고, exit() 시스템 호출을 사용하여 운영체제에게 자신의 삭제를 요청하면서 종료된다. 이 시점에서, 프로세스는 자신의

dongwooklee96.github.io