프로세스 테이블에서 좀비 프로세스 제거


8

init에 의해 채택되는 성가신 좀비 프로세스가 있으며 사라지지 않습니다. 더미 프로세스를 생성하고 좀비를 새로운 프로세스의 자식으로 연결 한 다음 프로세스 테이블에서 제거 하는 방법을 읽었습니다 .

정확히 어떻게해야합니까?

그리고 네, 나는 대부분의 것들을 읽었습니다.

좀비 프로세스가 이미 종료되었으므로 종료 할 수 없습니다.

또는

시스템을 재부팅하면됩니다

좀비 프로세스는 어떤 리소스도 사용하지 않습니다.

불행히도 많은 프로그램이 프로세스 테이블을 검사하여 인스턴스가 이미 실행 중인지 확인하고 프로세스 테이블에 항목이 있으면 새 인스턴스를 시작하지 않습니다.

그리고 SSHFS 연결이 끊어 질 때마다 재부팅하는 것은 Sublime과 함께 어리석은 일입니다.


7
... 산탄 총으로. ;)
Nathan C

+1. 메인을보고 "킬 좀비"를 보았 기 때문에
HopelessN00b

답변:


16

좀비를 제거 하는 유일한 방법 wait()은 종료 상태를보고 할 수 있도록 부모를 만드는 것 입니다. SIGCHLD부모가 제대로 작성되었다고 가정하면 부모에게 보내서 그렇게 할 수 있습니다 .

당신이 좀비가 있다면 그것은 일반적으로 부모가 의미 NOT (아이가 이미 전송하기 때문에 제대로 작성 SIGCHLD다음 단계는 부모를 죽일 것입니다, 그래서이 죽고 좀비가되었을 때 부모에). ( 옵션 포함) 과
같은 도구를 pstree사용하면 -p좀비의 계보를 표시하여 어떤 프로세스가 부모인지 알 수 있습니다.
부모가 죽으면에 의해 좀비가 입양 될 init것인데, 이는 항상 wait()아이들이 죽을 수 있도록하고 , 입양 한 모든 좀비를 행복하게 죽일 것입니다.

상위 프로세스가 실제로 init(PID 1) 이미있는 경우 절대 발생하지 않는 상황에 처해 있습니다. 에 보낼 SIGCHLDinit는 있지만 실제로 그렇게 할 필요는 없으며, 그래도 작동하지 않으면 시스템 init이 손상되어 작업을 수행하지 않기 때문에 재부팅해야합니다 .

(이것은 "shotgun"옵션입니다.)


일부 나보다 더 창의적인 사람 이 부모 프로세스를 죽이고 피하려는 경우이 옵션으로 올라와있다 :

  1. 좀비 및 부모 프로세스의 PIDS 결정
    (이 예에서는 좀비가 PID 3101이고 부모가 PID 3100이라고 가정합니다)
  2. 최대 화재 gdbattach부모 :
    attach 3100
  3. waitpid좀비를 불러주세요 :
    call waitpid(3101,0,0)
  4. 부모 ( detach) 에서 분리 하고 디버거를 종료하십시오.

(이것은 잘 조정 된 저격 소총입니다.)


1
허, 좋은 대답입니다. 바로 "모신"소총.
Danila Ladner

1
@DanilaLadner 나는 크레딧을 얻을 수 있기를 원하지만, 약간의 구글 사냥을 할 때까지 skerit가 "더미 프로세스의 자식으로 좀비를 붙인다"는 것이 디버거를 사용하여 waitpid()나에게 결코 일어나지 않았다는 생각을 의미 했습니다. 나는 끔찍한 전 프로그래머입니다 ...
voretaq7

call waitpid나를 위해 돌아 오지 않습니다
deFreitas

0

왜 좀비 프로세스가 걱정됩니까? 그들이 묶은 자원은 최소한입니다 (골격 구조 작업을위한 공간, PID 등). 물론,보기 흉한 일이지만, 그게 다입니다. 부모를 찾고 수정하고 더 나은 대안으로 대체하십시오 (다른 유익한 부작용이있을 수 있음).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.