왜 우리는 좀비를 죽일 수 없나요? [복사]

왜 우리는 좀비를 죽일 수 없나요? [복사]

이 질문은 좀비 프로세스를 종료하는 방법에 대한 다른 질문과 중복된 것으로 표시되어 편집 중입니다.

좀비 프로세스를 종료하는 방법에 대한 답을 찾고 있는 것이 아닙니다. 내 시스템에는 좀비가 없지만 좀비가 어떻게 생성되는지 알고 있습니다.

질문을 바꿔 보겠습니다. 현재 좀비를 제거하는 데 허용되는 방법은 다음과 같습니다.

  • SIGCHLD를 상위 항목으로 보냅니다. 이것은 이론적으로는 작동하지만 실제로 항상 작동하는 것은 아닙니다. 처음에 좀비가 생성된 이유 중 하나는 상위 프로세스가 SIGCHLD에 올바르게 응답하지 않았기 때문일 수 있습니다.

  • 상위 프로세스를 종료합니다.

  • 좀비 생성 과정의 버그를 수정했습니다.
  • 재시작.
  • 아니면 언급했듯이여기

  • 또는 이러한 이유로 @richard는 내 질문에 대한 편집의 이전 의견에서 이것을 언급했습니다.

    ..to prevent the pid being reused. The parent has the pid of the child and may signal the child (may try to kill it), just from the pid it recieved when it created the child. It would be bad for the pid to be reused. Therefore the child remains in a zombie state until the parent acknowledges the death of the child, or the parent dies.

이제 내 질문은 다음과 같습니다.

  • 하나 이상의 좀비를 제거할 직접적인 방법이 없는 이유는 무엇입니까?

  • 신호로 좀비를 죽일 수 있다면 부작용/결과는 무엇입니까?

  • *NIX 관리자가 좀비를 정리하는 신호나 명령을 생성하는 것을 방지하는 요소("새 신호 생성"이라는 문장이 기술적으로 허용되지 않는다면 죄송합니다).

답변1

그 당시에는 프로세스가 종료되었습니다. 더 이상 죽이는 것은 의미가 없습니다. 상위 ti가 해당 상태를 얻을 수 있도록 프로세스 테이블에 계속 기록됩니다.

모든 프로세스가 종료되면 좀비가 됩니다. 대부분의 상위 프로세스는 하위 프로세스를 매우 빠르게 정리하기 때문에 이를 볼 수 없습니다. 소프트웨어가 봇을 치료하지 않고 봇을 통해서만 치료할 수 있는 경우 버그 보고서를 제출해야 할 수도 있습니다.내부에상위 프로세스가 종료되면.

추가 질문은 SIGKILL프로세스 테이블에서 제거되지 않는 이유입니다. 먼저 우리가 왜 이 일을 해야 하는지 말해주세요. 사용자가 프로세스 테이블에서 존재하지 않는 프로세스를 삭제하는 이유를 모르겠습니다. 운영 체제 설계에서는 항상뭔가를 해야 할 좋은 이유물어보기 전에왜 이러지 않니?. 요청하신 기능에 대한 실제 사용 사례가 없습니다.

목적이 부족할 뿐만 아니라 바람직하지 않은 결과를 초래할 수도 있습니다. 학부모는 자녀의 자퇴 상태에 대해 전화 wait()및/또는 알아보십시오. waitpid()프로세스가 완료되기 전에 호출되는지 여부에 관계없이더 이상 존재하지 않는다, SIGKILL보내기 전이나 후에.

커널이 기록을 유지하지 않는 경우(즉, 프로세스가 프로세스 테이블에서 제거됨) 동작은 일관성이 없어야 하며 부모는 불일치를 예상하고 정당화 없이 처리해야 합니다. 오래된 시스템을 재사용함에 있어서PID기록을 유지하지 않으면 소프트웨어가 실수로 완전히 다른 프로세스를 종료하는 등 더 심각한 문제가 발생할 수 있습니다.

또한보십시오:http://en.wikipedia.org/wiki/Zombie_process

관련 정보