2012. 6. 25. 14:07

kill 명령으로도 죽여지지 않을때(레스판스센터에서 가져온내용입니다)

 

 

ps -ef 명령을 수행하여 보았더니 프로세스가 있고, kill 명령을 사용하여도 프로세스가 없어지지 않습니다.

 

 

ANSWER:

 

어떤 특정 프로세스가 자신의 일을 종료하였지만, 그 종료된
결과 또는 상태를 자신을 만들어준 parent process에게 보고 한후 종료
하려하지만 그 parent 프로세스는 child 프로세스를 기다려주지
않을 경우 이 프로세스는 defunct 라는 모양으로 보여지게 됩니다.

즉 자신에게 주어진 모든 일을 완수는 하였지만, 무슨 이유에서건
(parent가 child보다 먼저 프로세스를 종료하고 없어진 경우,
child로 부터의 return값을 받기위해 기다려 주지 않는 경우 등)
자신의 child process를 monitoring해 주지 않으면, 이 프로세스는
쉽게 말해 고아인 프로세스가 되어, 이 프로세스가 수행되기 위해
할당되었던 모든 환경들은 release 하였지만 프로세스 테이블로
부터는 제거되지 않은 상태로 남게된 프로세스를 말합니다.

이처럼 process가 만들어지는 것은 다음과 같이 크게
2가지 경우로 나누어 볼수 있습니다.

1) 진짜 zombie process가 되어 버린 경우.
어느 프로세스가 자신에게 주어진 모든 일을 완수하고 wait
시스템 콜을 사용하여 자신으로 부터의 결과를 기다리는 parent
프로세스가 있으면 ps -l 에서 보여주는 결과에는 "Z" 상태에
있음을 보여 줍니다.

이런 경우에는 kill -18 (또는 kill -CLD)를
하여 프로세스를 없애 버릴수 있으며, 만약 parent의 PID가
1번이 아니라면 parent 자체를 kill 함으로써 init 프로세스에게
zombie 프로세스를 clean up 시키도록 할수 있습니다.
그러나 parent process의 PID 가 1 (init process)로 되어 버린
경우에는 kill 이 불가능 하므로 시스템을 reboot 하는 방법 밖에
없습니다.


2) 프로세스가 자신의 일을 종료는 하였지만 정상적으로 exit 또는
terminate 되지 못한 상태에 있는 경우(즉 할당된 모든 커널자원들을
해제하지 못한 경우) , 이 원인은 일반적으로 어떤 특정 디바이스
와의 통신중에 발생하며, 이는 드라이버 프로그램의 bug 이거나
통신선로 상의 데이타들이 XOFF만을 만나게 되어 flushing
되지 못했을 경우에 발생됩니다.

이런 상태에 있는 것들은 ps -l 에서보면 "S" 상태에 있게 됩니다.
이럴때는 (XON)를 보내거나, 현재 묶여져 있는 모든
프로세스들을 kill 시키고 새로운 getty 프로세스를
생성시킴으로써 hung up 현상을 제거 시킬수 있는 경우도 있지만
원하는 결과가 나오지 않는 다면 시스템을 재시동(reboot) 시키는
방법 만이 있을 뿐입니다
* 기혀니님에 의해서 게시물 이동되었습니다 (2005-02-16 09:46)

Posted by 몰라욧