잘못 작성된거나 심하게 수행하는 남길 수 있습니다 프로그램 좀비 프로세스 리눅스 컴퓨터 내부에 숨어. 좀비가 생성되는 방법을 알아보십시오, 당신은 마침내 그들이 휴식을 배치하는 방법에 대해 설명합니다.
리눅스에 미국 일을 처리하는 방법
리눅스는 물론, 모든 응용 프로그램 및 컴퓨터에서 실행중인 데몬을 추적한다. 그것은이 작업을 수행하는 방법 중 하나는 프로세스 테이블을 유지하는 것입니다. 이것은 커널 메모리 구조의 목록입니다. 각 프로세스는 그것에 대해 몇 가지 정보가 포함이 목록의 항목이 있습니다.
프로세스 테이블 구조의 각 큰 거래는 없다. 그들은 개최 프로세스 ID 몇 가지 다른 데이터 항목 및 그 프로세스에 대한 프로세스 제어 블록 (PCB)에 대한 포인터.
그것은 리눅스 조회하거나 각 프로세스에 대해 설정하는 데 필요한 많은 정보를 보유하고있는 PCB입니다. 인쇄 회로 기판은 프로세스가 생성 될 때 처리 시간 또한 주어진 갱신하고, 마지막으로 파괴된다.
리눅스 PCB는 이상의 95 필드가 포함되어 있습니다.
그것은 정의되어
라는 구조로
task_struct.h
그리고 그것은 이상 700 라인 오래입니다. 인쇄 회로 기판은 다음과 같은 유형의 정보가 포함되어 있습니다
- 공정 상태 다음 상태를 설명한다.
- 프로세스 번호 : 운영 체제 내에서의 고유 식별자입니다.
- 프로그램 카운터 이 프로세스가 옆에 CPU에 대한 액세스 권한이 부여되면, 시스템이 실행되어야하는 프로세스의 다음 지시를 찾기 위해이 주소를 사용합니다.
- 레지스터 이 프로세스에서 사용 CPU 레지스터의 목록. 목록은 축전지, 인덱스 레지스터, 스택 포인터를 포함 할 수 있습니다.
- 파일 열기 목록 : 파일이 프로세스와 연관된.
- CPU 스케줄링 정보 : 얼마나 자주 확인하는 데 사용하고, 얼마 동안, CPU 처리 시간은이 과정에 수여된다. 프로세스의 우선 순위, 스케줄링 큐, 다른 일정 매개 변수에 대한 포인터는 PCB에 기록되어야한다.
- 메모리 관리 정보 : 세부 사항 등의 메모리 페이지의 시작과 끝 프로세스 메모리의 주소, 포인터 등이 프로세스가 사용하는 메모리에 대한.
- I / O 상태 정보 다음 프로세스에 의해 사용되는 모든 IN- 또는 출력 장치.
"프로세스 상태"다음 중 하나가 될 수 있습니다 :
- NS: 실행 또는 실행 가능한 프로세스입니다. 실행은 CPU 사이클을 받아 실행하는 것 의미한다. 실행 가능한 프로세스는 CPU 슬롯에 대한 실행 및 대기 할 준비가되어 있습니다.
- NS: 잠자는 과정. 이 과정은 이러한 인 - 또는 출력 작업으로, 전체에 액션을 기다리고, 또는 리소스를 사용할 수있게 할 수 있습니다.
- NS: 이 과정은 무정전 수면 상태에 있습니다. 그것은 차단 시스템 호출을 사용하고 시스템 호출이 완료 될 때까지 계속할 수 없습니다. 은 "수면"상태는 달리,이 상태에서 프로세스는 시스템 호출 신호하지 응답 완료 할 때까지 실행 프로세스에 반환했습니다.
-
NS:
는을 획득하기 때문에 프로세스가 종료 (중지)
SIGSTOP신호. 그것 만 응답 ~로시그키또는SIGCONT두 프로세스를 종료하거나 각각 계속 지시 신호. 이것은 당신이에서 교환 할 때 일어나는 일이다 전경 (...에 대한) 에게 배경 (BG)작업. -
지:
좀비 과정. 때 프로세스가 완료, 그냥 증발하지 않습니다. 그것은 사용하고있는 메모리를 해제하고 메모리에서 자신을 제거하지만 프로세스 테이블 및 PCB의 항목이 남아있다. 그 상태로 설정
EXIT_ZOMBIE그리고 부모 프로세스에 의해 (통보sigchld.자식 프로세스가 완료되었음을 신호).
좀비 상태에서, 부모 프로세스 중 하나를 호출
기다리다()
기능의 가족
하위 프로세스가 생성 될 때. 그런 다음 자식 프로세스의 상태 변경을 기다립니다. 어린이 프로세스가 신호로 계속 멈추거나 계속해서 살해 되었습니까? 코드의 자연스러운 완성을 통해 실행함으로써 종료 되었습니까?
상태가 변경되면 자식 프로세스가 실행 중지되었음을 의미하는 경우 종료 코드가 읽습니다. 그런 다음 자녀의 PCB가 파괴되고 프로세스 테이블의 항목이 제거됩니다. 이상적으로,이 모든 것은 눈 깜짝 할 사이에서 일어나고 좀비 상태의 과정은 매우 오래 존재하지 않습니다.
관련된: Linux에서 백그라운드 프로세스를 실행하고 제어하는 방법
Linux에서 좀비 프로세스를 원인은 무엇입니까?
부모 프로세스가 잘되지 않아
기다리다()
하위 프로세스가 생성 될 때 기능. 즉, 자녀 프로세스의 상태 변경을 보는 것은 아무 것도 없으며
sigchld.
신호가 무시됩니다. 또는 아마도 다른 응용 프로그램이 프로그래밍 또는 악의적 인 의도로 인해 부모 프로세스의 실행에 영향을 미칠 수 있습니다.
그러나 부모 프로세스가 자식 프로세스의 상태 변경을 보지 않으면 적절한 시스템 객체 관리가 발생하지 않습니다. 자식 프로세스가 종료되면 PCB와 프로세스 테이블의 항목이 제거되지 않습니다. 이렇게하면 좀비 상태가 PCB에서 제거되지 않습니다.
좀비는 약간의 기억을 사용하지만 일반적으로 문제가되지 않습니다. 프로세스 테이블의 항목이 작지만, 해제 될 때까지 프로세스 ID를 재사용 할 수 없습니다. 64 비트 운영 체제에서는 PCB가 프로세스 테이블 항목보다 훨씬 큽니다 때문에 문제가 발생하지는 않습니다.
엄청난 수의 좀비가 다른 프로세스에 대해 자유로운 기억의 양에 영향을 줄 수 있습니다. 그러나 많은 좀비를 얻은 경우 부모 응용 프로그램이나 운영 체제 버그에 심각한 문제가 발생했습니다.
좀비 프로세스를 제거하는 방법
이미 죽었 기 때문에 좀비 프로세스를 죽일 수 없습니다. 메모리에서 제거 되었기 때문에 어떤 신호에 응답하지 않습니다. 아무데도 없습니다.
시그키
신호. 당신은 그를 보낼 수 있습니다
sigchld.
부모 프로세스에 신호를 보내지만 자식 프로세스가 종료 될 때 작동하지 않으면 지금 작동하지 않을 것입니다.
유일한 신뢰할 수있는 해결책은 부모 프로세스를 종료하는 것입니다. 종료되면 자식 프로세스가
init.
프로세스는 Linux 시스템에서 실행되는 첫 번째 프로세스입니다 (프로세스 ID는 1입니다.).
NS
init.
프로세스는 정기적으로 좀비의 필요한 정리를 수행하므로 그들을 죽이기 위해, 당신은 그들을 생성하는 과정을 죽이는 것만으로 만드는 것입니다. NS
맨 위
명령은 좀비가 있는지 알 수있는 편리한 방법입니다.
다음을 입력하십시오.
이 시스템에는 8 개의 좀비 프로세스가 있습니다. 우리
이들을 나열 할 수 있습니다
그를 사용하여
추신
명령
그것을 파이프
egrep.
...에 다시 말하지만, 좀비 프로세스는 "Z"의 상태 플래그를 가지고 있으며 보통 "Defunct"를 볼 수 있습니다.
다음을 입력하십시오.
PS AUX | egrep "z | Defunct"
좀비 프로세스가 나열됩니다.
이것은 좀비의 프로세스 ID를 통해 앞뒤로 스크롤하는 것보다 공정 ID를 발견하는 것이 좋습니다.
맨 위
...에 우리는 또한 "Badprg"라는 응용 프로그램이 이러한 좀비를 산출했습니다.
첫 번째 좀비의 프로세스 ID는 7641이지만 부모 프로세스의 프로세스 ID를 찾아야합니다. 우리는 그것을 사용하여 그렇게 할 수 있습니다
다시. 우리는 출력 옵션을 사용할 것입니다 (
추신
-영형
) 말하다
추신
부모의 프로세스 ID 만 표시 한 다음
ppid =.
깃발.
우리가 찾고 싶어하는 과정은
-NS
(프로세스) 옵션을 선택한 다음 좀비의 프로세스 ID를 전달합니다.
따라서 프로세스 7641에 대한 프로세스 정보를 조회하기 위해 다음 명령을 입력하지만 부모 프로세스의 ID 만보 고합니다.
PS -O PPID = -P 7641
우리는 부모 프로세스 ID가 7636 인 것으로 알려줍니다. 이제는 이제이를 사용하여이를 참조 할 수 있습니다.
추신
한 번 더.
이것은 이전에 부모 프로세스의 이름과 일치하는 것을 봅니다. 부모 프로세스를 종료하려면 다음과 같이 kill 명령으로 SIGKILL 옵션을 사용하십시오.
죽이는 -sigkill 7636
부모 프로세스의 소유자에 따라 사용해야 할 수도 있습니다.
Sudo.
...에
좀비는 무서운 것이 아닙니다 ...
거대한 호드에있는 한 ... 몇몇은 걱정할 것이고 간단한 재부팅이 그들을 닦아 내지 않을 것입니다.
그러나 응용 프로그램이나 프로세스가 항상 좀비를 래핑하는 것으로 알아 차리면, 즉 당신이 들여다보아야 할 것입니다. 그것은 단지 슬픈 작성된 프로그램 일 가능성이 큽니다.이 경우 아마도 자식 프로세스 후에 제대로 정리하는 업데이트 된 버전이 있습니다.