Linux Zombie Process란? 좀비 프로세스 확인·원인 분석·해결 방법 완벽 가이드

Linux 서버를 운영하다 보면 Ubuntu에 로그인했을 때 다음과 같은 메시지를 발견하는 경우가 있습니다.

There are 3 zombie processes.

처음 보면 서버에 심각한 문제가 발생한 것처럼 보일 수 있지만, Zombie Process 자체는 Linux 프로세스 관리 과정에서 발생할 수 있는 상태입니다.

다만 좀비 프로세스가 계속 증가한다면 프로세스를 생성한 프로그램이나 서비스의 상태를 확인할 필요가 있습니다.

이번 글에서는 Linux Zombie Process가 무엇인지부터 확인 방법, 발생 원인과 해결 방법까지 알아보겠습니다.

Linux Zombie Process란?

Linux에서 프로세스가 실행을 종료하면 운영체제는 해당 프로세스의 종료 정보를 바로 완전히 제거하지 않습니다.

부모 프로세스가 자식 프로세스의 종료 상태를 확인할 수 있도록 PID와 종료 상태 등의 일부 정보를 잠시 남겨둡니다.

일반적으로 부모 프로세스가 자식 프로세스의 종료 상태를 정상적으로 회수하면 해당 정보도 제거됩니다.

하지만 부모 프로세스가 이를 정상적으로 처리하지 못하면 종료된 자식 프로세스의 정보가 프로세스 테이블에 계속 남게 됩니다.

이 상태를 Zombie Process, 즉 좀비 프로세스라고 합니다.

Zombie Process 확인 방법

현재 서버에 좀비 프로세스가 존재하는지 확인하려면 ps 명령어를 사용할 수 있습니다.

ps aux

프로세스 상태가 Z로 표시된다면 Zombie 상태를 의미합니다.

좀비 프로세스만 확인하고 싶다면 다음과 같이 사용할 수 있습니다.

ps aux | awk '$8=="Z"'

PID와 부모 프로세스인 PPID까지 함께 확인하려면 다음 명령어가 편리합니다.

ps -eo pid,ppid,state,cmd | awk '$3=="Z"'

출력 결과는 다음과 같은 형태로 나타날 수 있습니다.

PID    PPID    S    CMD
5231   4870    Z    [example] <defunct>

여기에서 Z는 Zombie 상태이며 <defunct> 역시 해당 프로세스가 이미 종료되었다는 것을 나타냅니다.

좀비 프로세스에 kill -9를 사용하면 될까?

좀비 프로세스를 발견하면 가장 먼저 다음 명령어를 생각할 수 있습니다.

kill -9 PID

하지만 Zombie Process는 이미 실행이 종료된 프로세스입니다.

따라서 좀비 프로세스 PID 자체에 SIGKILL을 보내더라도 일반적인 실행 프로세스를 종료하는 것처럼 문제가 해결되지 않습니다.

중요한 것은 해당 프로세스를 생성했던 부모 프로세스를 확인하는 것입니다.

부모 프로세스 PPID 확인하기

앞에서 확인한 결과에서 PPID를 찾았다면 다음 명령어를 실행합니다.

ps -fp PPID

예를 들어 PPID가 4870이라면 다음과 같이 확인할 수 있습니다.

ps -fp 4870

이를 통해 어떤 프로그램이나 서비스가 자식 프로세스의 종료 상태를 정상적으로 처리하지 못하고 있는지 추적할 수 있습니다.

운영 서버에서는 부모 프로세스를 무작정 종료하기보다 어떤 서비스와 연결되어 있는지 먼저 확인하는 것이 중요합니다.

Systemd 서비스라면 어떻게 해결할까?

Zombie Process의 부모가 Systemd에서 관리되는 서비스라면 해당 서비스의 상태를 먼저 확인합니다.

systemctl status 서비스명

서비스에 문제가 있고 재시작해도 서비스 운영에 영향을 주지 않는 상황이라면 다음과 같이 재시작할 수 있습니다.

sudo systemctl restart 서비스명

서비스가 다시 시작되면서 기존 부모 프로세스가 종료되고 관련 Zombie Process가 정리되는 경우가 있습니다.

journalctl로 원인 확인하기

좀비 프로세스가 반복적으로 발생한다면 단순히 프로세스를 정리하는 것보다 로그를 확인하여 원인을 찾는 것이 중요합니다.

Systemd 환경에서는 journalctl을 이용할 수 있습니다.

최근 로그를 확인하려면 다음과 같이 실행합니다.

journalctl -xe

특정 서비스의 로그만 확인하려면 다음과 같이 사용할 수 있습니다.

journalctl -u 서비스명

실시간으로 로그를 확인하려면 다음 명령어를 사용할 수 있습니다.

journalctl -u 서비스명 -f

Zombie Process가 생성되는 시간과 서비스 로그를 비교하면 어떤 프로그램에서 문제가 반복되는지 파악하는 데 도움이 됩니다.

서버를 재부팅하면 해결될까?

서버를 재부팅하면 현재 남아 있는 Zombie Process는 정리됩니다.

하지만 재부팅은 현재 상태를 초기화하는 방법일 뿐, 특정 프로그램이 계속 좀비 프로세스를 발생시키고 있다면 재부팅 이후에도 같은 현상이 다시 발생할 수 있습니다.

따라서 운영 서버에서는 다음 순서로 확인하는 것이 좋습니다.

Zombie Process 확인

PID와 PPID 확인

부모 프로세스 확인

관련 서비스 로그 확인

필요한 경우 서비스 재시작

반복 발생한다면 프로그램 또는 서비스 원인 분석

서버 재부팅은 필요한 경우 마지막 단계에서 고려하는 것이 좋습니다.

Ubuntu의 System restart required 메시지는 무엇일까?

Ubuntu 서버에 SSH로 접속했을 때 다음과 같은 메시지가 함께 나타날 수도 있습니다.

286 updates can be applied immediately.
*** System restart required ***

이 메시지 자체가 Zombie Process의 직접적인 원인이라는 의미는 아닙니다.

Ubuntu 업데이트가 존재하고 이미 적용된 패키지 중 시스템 재시작이 필요한 변경 사항이 있다는 의미입니다.

운영 서버라면 현재 실행 중인 서비스와 접속 사용자를 확인하고 적절한 유지보수 시간을 정한 뒤 업데이트와 재부팅을 진행하는 것이 좋습니다.

Zombie Process가 많으면 서버 성능이 느려질까?

몇 개의 Zombie Process가 존재한다고 해서 CPU나 메모리 사용량이 갑자기 크게 증가하는 것은 아닙니다.

Zombie Process는 이미 실행을 종료했기 때문에 일반적인 실행 프로세스처럼 CPU 작업을 계속 수행하지 않습니다.

하지만 프로세스 테이블에는 정보가 남아 있기 때문에 Zombie Process가 비정상적으로 계속 증가하는 상황을 방치하는 것은 좋지 않습니다.

특히 동일한 프로그램에서 반복적으로 발생한다면 해당 프로그램의 프로세스 관리 방식이나 서비스 상태를 확인해야 합니다.

Linux Zombie Process 핵심 정리

Zombie Process는 실행이 끝났지만 부모 프로세스가 종료 상태를 정상적으로 회수하지 않아 일부 정보가 남아 있는 프로세스입니다.

ps 명령어를 이용하면 Zombie 상태를 확인할 수 있으며, 문제를 분석할 때는 Zombie PID 자체보다 PPID를 함께 확인하는 것이 중요합니다.

단순히 kill -9를 반복하기보다는 부모 프로세스와 관련 서비스를 확인하고 journalctl 등을 이용해 로그를 분석해야 합니다.

Linux 서버 운영에서는 현재 나타난 현상을 제거하는 것보다 왜 동일한 현상이 발생했는지 원인을 추적하는 것이 안정적인 서버 관리에 더 중요합니다.

함께 보면 좋은 글

Zombie Process의 원인을 분석하려면 Linux 프로세스뿐만 아니라 Systemd 로그를 함께 확인하는 것이 좋습니다.

Linux journalctl 사용법 완벽 가이드! Systemd 로그 확인과 서버 문제 원인 분석하기

위 글을 함께 참고하면 특정 서비스에서 Zombie Process가 반복적으로 발생할 때 로그를 추적하고 원인을 분석하는 방법을 이해하는 데 도움이 됩니다.

댓글 남기기