2009-12-02 5 views
1

Python 스크립트에서 하위 프로세스 인 Popen()을 먼저 실행합니다. 그런 다음 나중에 해당 하위 프로세스를 kill -9 Pid까지 삭제하려고합니다.kill -9 이후 Ghost Process가 나타나는 이유

내가 발견 한 것은 kill 프로세스가 실행 된 후 그 프로세스의 GUI 창이 즉시 사라지기 때문에 서브 프로세스가 "중지됨"입니다. 그러나 죽이기 직후에 "ps aux"를 수행하면 동일한 프로세스 (동일한 PID)가 여전히 결과에 표시됩니다. 차이는 프로세스의 명령() 다음과 같은 한 쌍에 포함되어 있습니다 :

root 30506 0.0 0.0 0 0 s000 Z+ 6:13PM 0:00.00 (sample process)

이 내 프로세스가 논리적 감지 나누기 죽은 프로세스가 계속 PS에 의해 발견 될 수 있기 때문이다.

왜 이런 일이 발생하는지 알고 계십니까?

감사합니다.

+0

'kill -15'가 왜 충분하지 않습니까? – u0b34a0f6ae

답변

4

:

부모가 죽은 아이에 대한 waitpid()을하지 않았 음을 의미

Z Defunct ("zombie") process, terminated but not reaped by its parent.

.

waitpid() 외에도 자식을 실행할 때 double fork을 사용하여이를 피할 수 있습니다.

0

나는 -9 신호가 프로세스가 kill을 처리하고 약간의 시간 관리를 할 수 있다고 생각한다. 신호없이 프로세스를 종료 할 수 있습니다.

편집 : 아, 실제 -15 신호로 프로세스가 정상적으로 종료됩니다. 신경 쓰지 마. PS의 매뉴얼 페이지에서

+1

KILL 신호는 처리 할 수 ​​있지만 그 이후에는 프로그램이 종료됩니다. 프로세스가 청소를한다면 '좀비'상태에 있지 않을 것입니다. – Gonzalo

+1

어떻게 SIGKILL을 처리 할 수 ​​있습니까? 파이썬에서'signal.signal (signal.SIGKILL, handler)'는'sigaction()'을 지원하는 시스템에서 RuntimeError : (22, 'Invalid argument') 예외를 발생시킵니다. C에서는 SIGKILL에 대해'signal (2) '를 통해 시그널 핸들러를 설치할 수 있지만 호출되지는 않습니다. – mhawke

0

좀비 프로세스는 실제로 프로세스 테이블의 항목입니다. 그들은 달리지 않으며, 그들은 기억을 소비하지 않습니다. 부모가 이탈 코드를 확인하지 않았기 때문에 항목이 그대로 유지됩니다. Gonzalo가 제안한대로 이중 포크를 수행하거나 S 열에 Z가있는 모든 ps 행을 필터링 할 수 있습니다.

관련 문제