>  기사  >  php教程  >  Linux에서 좀비 프로세스 다루기

Linux에서 좀비 프로세스 다루기

高洛峰
高洛峰원래의
2016-12-17 11:54:431409검색

1. 좀비 프로세스란 무엇입니까?

좀비 프로세스는 상위 프로세스가 종료되었으며(부모 프로세스가 이를 기다리지 않았음(wait/waitpid 호출)), 프로세스를 수락하지 않는 경우를 의미합니다. 프로세스가 죽으면 좀비 프로세스, 즉 (좀비) 프로세스가 됩니다.


2. 좀비 프로세스가 생성되는 방식

프로세스가 종료 명령을 호출하면 실제로는 소멸되지 않고, 좀비 프로세스(Zombie)라고 불리는 데이터 구조(시스템 호출 종료, 그 기능은 프로세스를 종료시키는 것이지만 일반 프로세스를 좀비 프로세스로 바꾸는 것으로만 제한되며 완전히 파괴할 수는 없습니다).

리눅스 프로세스의 상태 중 좀비 프로세스는 메모리 공간을 거의 모두 포기하고 실행 가능한 코드가 없으며 프로세스 목록에서 위치만 유지하는 매우 특별한 종류입니다. . , 다른 프로세스가 수집할 수 있도록 프로세스의 종료 상태 및 기타 정보를 기록합니다. 시체를 수집하려면 상위 프로세스가 필요합니다.

상위 프로세스가 SIGCHLD 신호 처리 기능을 설치하지 않고 wait 또는 waitpid()를 호출하여 하위 프로세스가 끝날 때까지 기다리며 명시적으로 신호를 무시하지 않으면 좀비 상태로 유지됩니다. 이때 상위 프로세스가 종료되면 init 프로세스가 자동으로 하위 프로세스를 인수하고 해당 시체를 수집하며 여전히 삭제될 수 있습니다.

그러나 상위 프로세스가 루프이고 종료되지 않으면 하위 프로세스가 좀비 상태로 유지됩니다. 이것이 시스템에 때때로 많은 좀비 프로세스가 있는 이유입니다. 시스템에서 사용할 수 있는 프로세스 번호가 제한되어 있습니다. 좀비 프로세스가 많이 생성되면 사용 가능한 프로세스 번호가 없기 때문에 시스템에서 새 프로세스를 생성할 수 없습니다.

3 , 좀비 프로세스 피하기

1. 부모 프로세스는 wait, waitpid 등의 함수를 통해 자식 프로세스가 끝날 때까지 기다립니다. 이로 인해 부모 프로세스가 중단됩니다.

2. 상위 프로세스가 매우 바쁜 경우 신호 기능을 사용하여 SIGCHLD에 대한 핸들러를 설치할 수 있습니다. 하위 프로세스가 끝난 후 상위 프로세스가 신호를 수신하고 핸들러에서 대기를 호출하여 재활용할 수 있기 때문입니다.

3. 상위 프로세스가 하위 프로세스 종료 시점을 신경 쓰지 않는 경우 신호(SIGCHLD, SIG_IGN)를 사용하여 하위 프로세스 종료에 관심이 없음을 커널에 알릴 수 있습니다. 종료되면 커널은 재활용되고 더 이상 상위 프로세스에 신호를 보내지 않습니다

 4. 몇 가지 트릭이 있습니다. 즉, 상위 프로세스가 하위 프로세스를 포크한 다음 하위 프로세스가 계속해서 포크됩니다. 그런 다음 손자 프로세스가 init에 의해 인수됩니다. 손자 프로세스가 끝나면 init가 이를 재활용합니다. 그러나 하위 프로세스의 재활용은 직접 수행해야 합니다.

자식 프로세스가 종료된 후 좀비 상태에 들어가는 이유는 무엇입니까?

부모 프로세스가 자식 프로세스의 종료 상태 및 기타 정보를 얻고 싶어할 수 있기 때문입니다.

좀비 상태는 각 하위 프로세스가 통과하는 상태인가요?

모든 하위 프로세스(init 제외)는 종료() 직후 사라지지 않고 이름을 남기는 것입니다. 좀비 프로세스(Zombie)의 구조(일부 메모리 자원을 점유함, 즉 프로세스 테이블에 여전히 레코드가 있음)는 상위 프로세스의 처리를 기다리고 있습니다. 모든 하위 프로세스가 마지막에 거치는 단계입니다. 자식 프로세스가 종료() 이후에 처리할 시간이 없다면 ps 명령을 사용하여 자식 프로세스의 상태가 "Z"인지 확인할 수 있습니다.

부모 프로세스가 시간 내에 처리할 수 있다면 ps 명령을 사용하여 자식 프로세스의 좀비 상태를 확인하기에는 너무 늦을 수 있지만 그렇다고 자식 프로세스가 좀비를 거치지 않는다는 의미는 아닙니다. 상태.

하위 프로세스가 종료되기 전에 상위 프로세스가 종료되면 하위 프로세스가 init에 의해 인수됩니다. init는 좀비 상태의 자식 프로세스를 부모 프로세스로 처리합니다.

4. 좀비 프로세스 보는 방법

Linux에서는 ps 명령어를 사용하면 Z로 표시된 프로세스가 좀비 프로세스임을 알 수 있다.

ps -ef|grep defunc는 좀비 프로세스를 찾을 수 있습니다.

ps의 -l 옵션을 사용하면 F(플래그): 일련의 프로세스 정보를 합칠 수 있습니다. 숫자, 프로세스의 현재 상태를 나타냅니다. 이 숫자의 의미는 다음과 같습니다.

00: 단독으로 표시되면 프로세스가 종료되었음을 의미합니다.

01: 프로세스는 핵심 프로세스의 일부이며 시스템 메인 메모리에 상주합니다. 예: sched, vhand, bdflush 등

02: 부모가 프로세스를 추적 중입니다.

04: 부모의 신호를 추적하면 프로세스가 중지되었습니다. 부모가 대기 중입니다( ptrace(S)). 대기 중인 경우와 같은 신호로 깨어날 수 없습니다. 생성될 inode
20: 프로세스가 메인 메모리(주 메모리)에 로드됩니다.
40: 프로세스가 메인 메모리에 잠겨 있어 트랜잭션이 완료될 때까지 사용할 수 없습니다. 교체

 S (프로세스의 상태)

 O: 프로세서에서 프로세스가 실행 중

 S: Sleeping 상태(sleeping)

 R: Waiting to run(runable)  

I: 유휴 상태( Idle)

Z: 좀비 상태(zombie)
T: 추적된 상태(Traced)
B: 프로세스가 추가 메모리 페이지를 기다리고 있는 중
C: CPU 사용률 추정값(CPU 사용량)



5. 좀비 프로세스 삭제 방법

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 중국어 웹사이트를 주목하세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.