
제대로 작성되지 않았거나 성능이 떨어지는 프로그램은 Linux 컴퓨터 내부에 좀비 프로세스를 숨길 수 있습니다. 좀비가 어떻게 생성되는지, 그리고 어떻게 좀비를 눕혀 놓을 수 있는지 알아보십시오.
Linux에서 프로세스 상태가 작동하는 방식
물론 Linux는 컴퓨터에서 실행되는 모든 응용 프로그램과 데몬을 추적해야합니다. 이를 수행하는 방법 중 하나는 프로세스 테이블을 유지하는 것입니다. 이것은 커널 메모리의 구조 목록입니다. 각 프로세스에는 관련 정보를 포함하는이 목록의 항목이 있습니다.
각 프로세스 테이블 구조에는 그다지 많지 않습니다. 여기에는 프로세스 ID, 몇 가지 다른 데이터 항목 및 해당 프로세스의 프로세스 제어 블록 (PCB)에 대한 포인터가 있습니다.
Linux가 각 프로세스에 대해 조회하거나 설정하는 데 필요한 많은 세부 정보를 보유하는 것은 PCB입니다. PCB는 또한 프로세스가 생성되고 처리 시간이 주어지고 최종적으로 파괴됨에 따라 업데이트됩니다.
Linux PCB에는 95 개 이상의 필드가 있습니다. 이것은 다음과 같은 구조로 정의됩니다. task_struct.h, 700 줄이 넘습니다. PCB에는 다음 유형의 정보가 포함됩니다.
- 프로세스 상태: 상태는 아래에 설명되어 있습니다.
- 프로세스 번호: 운영 체제 내에서 고유 한 식별자입니다.
- 프로그램 카운터:이 프로세스가 다음에 CPU에 대한 액세스 권한이 주어지면 시스템은이 주소를 사용하여 실행해야하는 프로세스의 다음 명령을 찾습니다.
- 레지스터:이 프로세스에서 사용하는 CPU 레지스터 목록입니다. 목록에는 누산기, 인덱스 레지스터 및 스택 포인터가 포함될 수 있습니다.
- 파일 목록 열기:이 프로세스와 관련된 파일입니다.
- CPU 스케줄링 정보:이 프로세스에 할당되는 CPU 처리 시간과 빈도를 결정하는 데 사용됩니다. 프로세스의 우선 순위, 스케줄링 대기열에 대한 포인터 및 기타 스케줄링 매개 변수는 PCB에 기록되어야합니다.
- 메모리 관리 정보: 프로세스 메모리의 시작 및 끝 주소, 메모리 페이지에 대한 포인터 등이 프로세스가 사용중인 메모리에 대한 세부 정보입니다.
- I / O 상태 정보: 프로세스에서 사용하는 모든 입력 또는 출력 장치.
“프로세스 상태”는 다음 중 하나 일 수 있습니다.
- 아르 자형: 실행 중이거나 실행 가능한 프로세스입니다. 실행 중이 란 CPU주기를 받고 실행 중임을 의미합니다. 실행 가능한 프로세스는 실행할 준비가되어 있으며 CPU 슬롯을 기다립니다.
- 에스: 수면 과정. 프로세스는 입력 또는 출력 작업과 같은 작업이 완료되거나 리소스를 사용할 수있을 때까지 기다리고 있습니다.
- 디: 프로세스가 중단 불가능한 절전 상태입니다. 차단 시스템 호출을 사용 중이며 시스템 호출이 완료 될 때까지 계속할 수 없습니다. “Sleep”상태와 달리이 상태의 프로세스는 시스템 호출이 완료되고 실행이 프로세스로 돌아올 때까지 신호에 응답하지 않습니다.
-
티: 프로세스가 종료 (중지)되었습니다.
SIGSTOP신호. 그것은SIGKILL또는SIGCONT프로세스를 종료하거나 계속하도록 지시하는 신호. 이것은 포 그라운드에서 스왑 할 때 일어나는 일입니다 (fg)을 배경 (bg)작업. -
지: 좀비 프로세스. 프로세스가 완료되면 그냥 사라지지 않습니다. 사용중인 모든 메모리를 해제하고 메모리에서 제거하지만 프로세스 테이블 및 PCB의 항목은 그대로 유지됩니다. 상태는 다음으로 설정됩니다.
EXIT_ZOMBIE, 상위 프로세스에 알림이 전송됩니다 (SIGCHLD신호) 자식 프로세스가 완료되었음을 나타냅니다.
Zombie 상태에서 부모 프로세스는 wait() 자식 프로세스가 생성 될 때 기능 군. 그런 다음 하위 프로세스의 상태 변경을 기다립니다. 자식 프로세스가 신호에 의해 중지, 계속 또는 종료 되었습니까? 코드가 자연스럽게 완성되어 종료 되었습니까?
상태 변경이 하위 프로세스 실행이 중지되었음을 의미하는 경우 종료 코드를 읽습니다. 그런 다음 자식의 PCB가 파괴되고 프로세스 테이블의 항목이 제거됩니다. 이상적으로는이 모든 것이 눈 깜짝 할 사이에 발생하며 좀비 상태의 프로세스는 오랫동안 존재하지 않습니다.
관련 : Linux에서 백그라운드 프로세스를 실행하고 제어하는 방법
Linux에서 좀비 프로세스의 원인은 무엇입니까?
잘못 작성된 부모 프로세스는 wait() 자식 프로세스가 생성 될 때 기능. 이것은 자식 프로세스의 상태 변경을 감시하는 것이 없으며 SIGCHLD 신호는 무시됩니다. 또는 잘못된 프로그래밍이나 악의적 인 의도로 인해 다른 응용 프로그램이 상위 프로세스의 실행에 영향을 미치고있을 수 있습니다.
그러나 부모 프로세스가 자식 프로세스의 상태 변경을 감시하지 않으면 적절한 시스템 관리가 발생하지 않습니다. PCB와 프로세스 테이블의 항목은 자식 프로세스가 종료 될 때 제거되지 않습니다. 이로 인해 좀비 상태가 PCB에서 제거되지 않습니다.
좀비는 약간의 메모리를 사용하지만 일반적으로 문제가되지는 않습니다. 프로세스 테이블의 항목은 작지만 릴리스 될 때까지 프로세스 ID를 재사용 할 수 없습니다. 64 비트 운영 체제에서는 PCB가 프로세스 테이블 항목보다 훨씬 크기 때문에 문제가 발생하지 않습니다.
엄청난 수의 좀비가 다른 프로세스에 사용할 수있는 메모리 양에 영향을 미칠 수 있습니다. 하지만 좀비가 그렇게 많으면 상위 응용 프로그램이나 운영 체제 버그에 심각한 문제가있는 것입니다.
좀비 프로세스를 제거하는 방법
좀비 프로세스는 이미 죽었 기 때문에 죽일 수 없습니다. 메모리에서 제거 되었기 때문에 신호에 응답하지 않습니다. SIGKILL 신호. 당신은 보낼 수 있습니다 SIGCHLD 부모 프로세스에 신호를 보내지 만 자식 프로세스가 종료되었을 때 작동하지 않으면 지금도 작동하지 않을 것입니다.
신뢰할 수있는 유일한 해결책은 부모 프로세스를 종료하는 것입니다. 종료되면 자식 프로세스는 init 프로세스는 Linux 시스템에서 실행되는 첫 번째 프로세스입니다 (프로세스 ID는 1 임).
그만큼 init 프로세스는 정기적으로 필요한 좀비 정리를 수행하므로 그들을 죽이려면 좀비를 생성 한 프로세스를 종료해야합니다. 그만큼 top 명령은 좀비가 있는지 확인하는 편리한 방법입니다.
다음을 입력하십시오.
top

이 시스템에는 8 개의 좀비 프로세스가 있습니다. 우리는 ps 명령 및 파이프 egrep. 다시 말하지만 좀비 프로세스에는 “Z”상태 플래그가 있으며 일반적으로 “defunct”도 표시됩니다.
다음을 입력하십시오.
ps aux | egrep "Z|defunct"

좀비 프로세스가 나열됩니다.

이것은 앞뒤로 스크롤하는 것보다 좀비의 프로세스 ID를 발견하는 더 깔끔한 방법입니다. top. 또한 “badprg”라는 응용 프로그램이 이러한 좀비를 생성 한 것을 볼 수 있습니다.
첫 번째 좀비의 프로세스 ID는 7641이지만 상위 프로세스의 프로세스 ID를 찾아야합니다. 우리는 다시. 출력 옵션 (ps-o) 말하다 ps 부모의 프로세스 ID 만 표시 한 다음 ppid= 깃발.
찾고자하는 프로세스는 다음을 사용하여 표시됩니다. -p (process) 옵션을 선택한 다음 좀비의 프로세스 ID를 전달합니다.
따라서 다음 명령을 입력하여 프로세스 7641에 대한 프로세스 정보를 조회하지만 상위 프로세스의 ID 만보고합니다.
ps -o ppid= -p 7641

상위 프로세스 ID가 7636이라고 들었습니다. 이제 다음을 사용하여이를 상호 참조 할 수 있습니다. ps 한 번 더.

이전의 상위 프로세스 이름과 일치합니다. 상위 프로세스를 종료하려면 다음과 같이 kill 명령과 함께 SIGKILL 옵션을 사용하십시오.
kill -SIGKILL 7636
상위 프로세스의 소유자에 따라 다음을 사용해야 할 수도 있습니다. sudo.
좀비는 무섭지 않습니다…
… 그들이 거대한 무리에 있지 않는 한. 일부는 걱정할 필요가 없으며 간단한 재부팅으로 제거됩니다.
그러나 응용 프로그램이나 프로세스가 항상 좀비를 낳는다는 사실을 알게된다면 그 점을 살펴보아야합니다. 아마도 엉성하게 작성된 프로그램 일 가능성이 큽니다.이 경우 하위 프로세스 후에 제대로 정리되는 업데이트 된 버전이있을 수 있습니다.








