본문 바로가기
[IT 관련 지식]/[Linux]

좀비 프로세스

by 판톰 2014. 3. 9.
반응형

좀비프로세스

리눅스 시스템을 운영 하면서 처음 접해본 좀비프로세스

운영자 입장에서 봤을때 시스템은 항상 아무런 문제 없이 운영되기를 바라지만

운영자의 생각과 다르게 비정상적으로 프로세스 가 종료되지 않고 메모리 상에 남아 있는 상황을 접하게 된다

이로 인해 서비스운영 중인 시스템이 정상적으로 동작 되지 않아 클레임도 받고 맨붕을 접할때가 잦았던

과거를 기억해본다.

   

[좀비프로세스 정의]

- 프로세스 종료 후 메로리상에서 사라지지 않은 프로세스

   

좀비프로세스 발생시 리눅스에서 ps -aux | Z & z 로 프로세스 상에 남아 있는 좀비 프로세스를 확인 할수 있다.

   

이게 발생 하지 않는게 가장 좋겠지만

사람이 완벽 하지 않은 것처럼 그것을 만든 프로그램또한 완벽할수 없기에

최대한 이런 비정상 프로세스가 발생되지 않게 또는 감시 프로그램을 통해

안정적인 시스템 운영에 도움이 될것이다.

   

    

좀비 프로세스 생성 이유

- 자식 프로세스가 종료하면서 반환된 값 0을 커널이 부모 프로세스에 전달한 후 자식 프로세스를 소멸시킴.

- 반환값을 부모 프로세스에 전달하지 못한 경우 자식 프로세스는 좀비로 존재.

- 부모 프로세스가 커널에게 종료된 자식 프로세스의 리턴값을 전달 요청을 해야만

커널이 리턴값 전달 가능함

   

   

   

   

   

종료된 자식 프로세스의 리턴값 요청 함수

1. wait 함수

#include <sys/types.h>

#include <sys/wait.h>

pid_t wait(int * status);

성공시 종료된 자식 프로세스 ID, 실패시 -1 리턴

- status : 포인터 status가 가리키는 변수에 자식 프로세스 종료시 리턴하거나

exit 함수 호출시 젂달한 인자값이 저장됨

- 매크로함수 WEXITSTATUS(status)로 종료시 리턴값이나 exit() 인자로 넘겨진 값 확인

- 호출 시점에 종료된 자식 프로세스가 없으면 blocking 상태에 빠짐

   

2. waitpid 함수 (wait함수의 blocking 상태 해결)

#include <sys/types.h>

#include <sys/wait.h>

pid_t waitpid(pid_t pid, int * status, int options);

성공시 종료된 자식 프로세스ID(경우에 따라 0), 실패시 -1 리턴

- pid : 종료 확인을 원하는 자식 프로세스 ID. 임의의 자식 프로세스인 경우 -1 대입.

- status : wait 함수의 status와 같은 역할

- options : sys/wait.h에 정의된 'WNOHANG' 상수를 인자로 젂달하게 되면 이미 종료한

자식 프로세스가 없는 경우 blocking 상태로 가지않고 바로 리턴함.

이때 waitpid 함수의 리턴값은 0이 된다

   

waitpid 함수의 호출 시점은??

- 자식 프로세스가 종료되는 순간 부모 프로세스가 waitpid 함수를 호출하도록 해야함

- 자식 프로세스가 종료된 시점에 발생하는 시그널 SIGCHLD를 이용

- sigaction 함수를 사용하여 SIGCHLD가 발생시 부모 프로세스가 자식 프로세스의 리턴값을 읽도록 함

   

반응형

'[IT 관련 지식] > [Linux]' 카테고리의 다른 글

우분투 14.04 Unity 한글 버그 패치 적용  (0) 2014.05.05
우분투 14.04 업그레이드  (0) 2014.04.20
freebsd 설치방법  (0) 2014.01.15
tacacs+ 인증  (1) 2013.06.04
apt-get 옵션  (0) 2013.06.04