1. 좀비 프로세스란 무엇입니까?
좀비 프로세스는 상위 프로세스가 종료되었으며(부모 프로세스가 이를 기다리지 않았음(wait/waitpid 호출)), 프로세스를 수락하지 않는 경우를 의미합니다. 프로세스가 죽으면 좀비 프로세스, 즉 (좀비) 프로세스가 됩니다.
2. 좀비 프로세스가 생성되는 방식
프로세스가 종료 명령을 호출하면 실제로는 소멸되지 않고, 좀비 프로세스(Zombie)라고 불리는 데이터 구조(시스템 호출 종료, 그 기능은 프로세스를 종료시키는 것이지만 일반 프로세스를 좀비 프로세스로 바꾸는 것으로만 제한되며 완전히 파괴할 수는 없습니다).
리눅스 프로세스의 상태 중 좀비 프로세스는 메모리 공간을 거의 모두 포기하고 실행 가능한 코드가 없으며 프로세스 목록에서 위치만 유지하는 매우 특별한 종류입니다. . , 다른 프로세스가 수집할 수 있도록 프로세스의 종료 상태 및 기타 정보를 기록합니다. 시체를 수집하려면 상위 프로세스가 필요합니다.
상위 프로세스가 SIGCHLD 신호 처리 기능을 설치하지 않고 wait 또는 waitpid()를 호출하여 하위 프로세스가 끝날 때까지 기다리며 명시적으로 신호를 무시하지 않으면 좀비 상태로 유지됩니다. 이때 상위 프로세스가 종료되면 init 프로세스가 자동으로 하위 프로세스를 인수하고 해당 시체를 수집하며 여전히 삭제될 수 있습니다.
그러나 상위 프로세스가 루프이고 종료되지 않으면 하위 프로세스가 좀비 상태로 유지됩니다. 이것이 시스템에 때때로 많은 좀비 프로세스가 있는 이유입니다. 시스템에서 사용할 수 있는 프로세스 번호가 제한되어 있습니다. 좀비 프로세스가 많이 생성되면 사용 가능한 프로세스 번호가 없기 때문에 시스템에서 새 프로세스를 생성할 수 없습니다.
3 , 좀비 프로세스 피하기
4. 좀비 프로세스 보는 방법
01: 프로세스는 핵심 프로세스의 일부이며 시스템 메인 메모리에 상주합니다. 예: sched, vhand, bdflush 등
02: 부모가 프로세스를 추적 중입니다. 04: 부모의 신호를 추적하면 프로세스가 중지되었습니다. 부모가 대기 중입니다( ptrace(S)). 대기 중인 경우와 같은 신호로 깨어날 수 없습니다. 생성될 inode
20: 프로세스가 메인 메모리(주 메모리)에 로드됩니다.
40: 프로세스가 메인 메모리에 잠겨 있어 트랜잭션이 완료될 때까지 사용할 수 없습니다. 교체
S (프로세스의 상태)
O: 프로세서에서 프로세스가 실행 중
R: Waiting to run(runable)
I: 유휴 상태( Idle) Z: 좀비 상태(zombie)
T: 추적된 상태(Traced)
B: 프로세스가 추가 메모리 페이지를 기다리고 있는 중
C: CPU 사용률 추정값(CPU 사용량)
1. 상위 프로세스를 다시 작성하고 종료된 하위 프로세스의 본문을 수집합니다. 구체적인 방법은 SIGCHLD 신호를 인수하는 것입니다. 하위 프로세스가 종료된 후 SIGCHLD 신호가 상위 프로세스로 전송됩니다. 상위 프로세스는 이 신호를 수신한 후 waitpid() 함수를 실행하여 하위 프로세스의 시체를 수집합니다. 이는 상위 프로세스가 wait를 호출하지 않더라도 커널이 SIGCHLD 메시지를 보내는 원칙에 기반합니다. 기본 처리는 이를 무시하는 것이지만 이 메시지에 응답하려면 처리 기능을 설정할 수 있습니다. .
SIGCHLD 신호: 하위 프로세스가 종료되면 상위 프로세스가 이 신호를 받습니다. 부모 프로세스가 이 신호를 처리하지 않고 자식 프로세스를 기다리지 않으면 자식 프로세스가 종료되더라도 여전히 커널 프로세스 테이블의 항목을 차지하게 됩니다. 이때 자식 프로세스를 좀비 프로세스라고 합니다. 우리는 이런 상황을 피해야 합니다. (상위 프로세스는 SIGCHILD 신호를 무시하거나 이를 포착하거나, 생성된 하위 프로세스를 기다리거나, 상위 프로세스가 먼저 종료된 후 자동으로 하위 프로세스의 종료가 init 프로세스에 의해 인계됩니다. ).
2.kill -18 PPID (PPID는 상위 프로세스)
이 신호는 하위 프로세스가 종료되었음을 상위 프로세스에 알리므로 할당된 리소스를 회수하십시오.
SIGCONT도 흥미로운 신호입니다. 앞서 언급했듯이 프로세스가 중지되면 이 신호는 프로세스 실행을 다시 시작하도록 알리는 데 사용됩니다. 이 신호의 흥미로운 점은 무시하거나 차단할 수 없지만 포착할 수 있다는 것입니다. 기본 동작은 신호를 삭제하는 것입니다.
3. 상위 프로세스 종료
방법 2를 종료할 수 없는 경우 상위 프로세스가 필요하지 않은 경우 상위 프로세스를 종료하는 방법을 사용할 수 있습니다. , 좀비 프로세스는 "고아" 프로세스가 됩니다. 1번 프로세스인 init에는 "프로세스"가 채택됩니다. Init는 항상 좀비 프로세스를 정리할 책임이 있습니다. 생성된 모든 좀비 프로세스도 사라졌습니다.
먼저 상위 프로세스에 다른 하위 프로세스가 없는지 확인하세요. 있는 경우 먼저 다른 하위 프로세스, 즉 형제 프로세스를 종료해야 할 수도 있습니다. 방법은 다음과 같습니다.
Kill –15 PID1 PID2(PID1 및 PID2는 좀비 프로세스의 상위 프로세스의 다른 하위 프로세스입니다.)
그런 다음 상위 프로세스를 종료합니다: kill –15 PPID
이러한 방식으로 좀비 프로세스가 완전히 종료될 수 있습니다.
Linux에서 좀비 프로세스를 처리하는 방법에 대한 더 많은 관련 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!