좀비 프로세스 생성 이유

https://iprize.tistory.com/647

프로세스가 리눅스에서 종료될 때 그 즉시 메모리에서 제거되지 않는다. Process Descriptor가 메모리에 남는다. (Process Descriptor는 매우 적은양의 메모리만 차지한다) 프로세스 상태는 EXIT_ZOMBIE가 되며 부모 프로세스에게 자식 프로세스가 SIGCHLD 신호로 종료되었음을 알린다. 그러면 부모 프로세스는 자식 프로세스의 종료 상태와 기타 정보를 읽기 위해 wait() 시스템 콜을 실행하여야 한다. 부모 프로세스는 죽은 프로세스로부터 정보를 얻는 것이 허용되어 있다. wait()이 호출된 후 좀비 프로세스는 메모리에서 완전히 제거된다. 이러한 과정은 매우 빠르게 일어나기 때문에 시스템에 좀비 프로세스에 누적되는 것을 볼 수 없을 것이다. 하지만 부모 프로세스가 제대로 프로그래밍되지 않았다면 wait()을 호출하지 않을 것이며 좀비 프로세스는 메모리에 존재할 것이다.

좀비 프로세스의 위험성

좀비 프로세스는 시스템 자원을 소모하지 않는다. (사실, 각 좀비는 process descriptor를 저장하기 위해 아주 적은 양의 시스템 메모리를 사용한다.) 그렇지만 모든 좀비 프로세스는 프로세스 ID(PID)를 남긴다. 리눅스 시스템은 한정된 프로세스 ID를 가진다. 32비트 시스템에서는 32767의 제한이 있다. 만일 좀비 프로세스가 빠른 비율로 축적된다면, 예를 들면 부적합하게 프로그래밍된 서버 소프트웨어가 좀비 프로세스를 생성하면 결국 전체 가용 PID를 좀비 프로세스에 할당하여 다른 프로세스의 실행을 방해할 것이다. 하지만 소수의 좀비 프로세스가 남아 있는 것은 버그이지만 시스템에 큰 문제가 되지 않는다.

좀비 프로세스 찾기

https://velog.io/@jaylnne/Linux-좀비-프로세스-defunct-죽이기-간단-정리

ps -ef | grep defunct | grep -v grep

# out
[root@server ~]# ps -ef | grep defunct | grep -v grep
jaylnne 21207 21205  0 Feb26 ?        00:00:00 [my_script.sh] <defunct>

좀비 프로세스 죽이기

kill -9 21205

Tip ❗  부모 프로세스의 부모 프로세스(조부모 프로세스)가 있는 경우도 있다. 자식 프로세스를 죽이는 것이 목적이라면 조부모 프로세스까지 죽일 필요는 없다. 부모 프로세스만 죽이면 좀비가 된 자식 프로세스를 완전히 죽일 수 있다.