
이 질문은 좀비 프로세스를 종료하는 방법에 대한 또 다른 질문으로 중복으로 표시되었으므로 편집 중입니다.
나는 좀비 프로세스를 죽이는 방법에 대한 답을 찾고 있는 것이 아닙니다. 내 시스템에는 좀비가 없으며 좀비가 어떻게 생성되는지 알고 있습니다.
질문을 다시 표현해 보겠습니다. 현재 좀비를 제거하는 데 허용되는 방법은 다음과 같습니다.
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.
이제 내 질문은 다음과 같습니다.
왜냐면 좀비나 좀비들을 청소하는 간단하고 직접적인 방법이 없기 때문입니다.
신호로 좀비를 죽일 수 있다면 부작용/결과는 어떻게 될까요?
좀비를 정리하는 SIGNAL 또는 명령('새 신호 생성'이라는 문구가 기술적으로 허용되지 않는 경우 사과드립니다)을 생성하기 위해 *NIX 마이테이너를 중지하는 것은 무엇입니까?
답변1
그 당시 프로세스는 이미 종료되었습니다. 또 죽이는 건 말도 안 돼요. 상위 ti가 해당 상태를 선택할 수 있도록 프로세스 테이블에 계속 기록됩니다.
모든 프로세스는 종료된 후 좀비가 됩니다. 대부분의 상위 프로세스는 하위 프로세스를 매우 빠르게 정리하기 때문에 이를 볼 수 없습니다. 소프트웨어가 좀비를 정리하지 않고 다음 작업으로만 정리하는 경우 버그 보고서를 제출할 수 있습니다.초기화상위 프로세스가 종료되면.
추가 질문은 SIGKILL
프로세스 테이블에서 제거하지 않는 이유입니다. 먼저 왜 그래야 하는지 알려주셔야 합니다. 사용자가 프로세스 테이블에서 존재하지 않는 프로세스를 제거하도록 허용하는 단일 이유를 알지 못합니다. 운영 체제 설계에서는 항상뭔가를 해야 할 좋은 이유물어보기 전에왜 하지 않는가?. 실제 사용 사례가 없는 기능을 요구하고 있습니다.
목적이 없다는 점 외에도 나쁜 결과를 초래할 수 있습니다. 부모는 전화를 걸 wait()
거나 waitpid()
나간 자녀의 상태를 확인합니다. 프로세스가 시작되기 전에 호출되었는지 여부에 관계없이 호출 결과는 일관됩니다.없어져 버린, 을 실행하기 전 SIGKILL
, 또는 그 후에.
커널이 기록을 유지하지 않는 경우(즉, 프로세스가 프로세스 테이블에서 제거됨) 동작은 일관성이 없어야 하며 부모는 불일치를 예상하고 타당한 이유 없이 이에 대처해야 합니다. 오래된 것을 재사용하는 시스템에서PID기록을 유지하지 않으면 소프트웨어가 실수로 완전히 다른 프로세스를 종료하는 등 훨씬 더 심각한 문제가 발생할 수 있습니다.