Linux에서 좀비 프로세스를 찾아 죽이는 방법

Linux에서 좀비 프로세스를 찾아 죽이는 방법

2022-06-04 last update

7 minutes reading Linux Commands
프로세스의 실행이 끝났을 때, 이것은 Zombie 또는 "dead"프로세스라고 불리지만, 프로세스 테이블에 들어갈 수 있습니다.이상적인 상황에서 이러한 절차는 실행이 끝난 후에 절차표에서 삭제해야 한다.그러나 일부 이유로 부모 프로세스가 제대로 삭제하지 않았습니다.
이러한 "실효"프로세스는 주로 하위 프로세스에서 발생합니다.부모 프로세스가 하위 프로세스의 종료 상태를 읽습니다.이것은wait () 시스템을 통해 호출된 것입니다.일단 완성되면 좀비의 진행은 사라진다.이것은 좀비를 수확하는 과정이라고 불린다.
좀비 과정의 형성과 제거를 더욱 잘 이해하기 위해 아래 그림에 따라 조작하세요.

좀비 진행 상태가 어떻게 작동하는지


좀비 프로세스 상태에 들어가기 전에 Linux의 프로세스 상태를 간략하게 설명합니다.
Linux는 유지 보수 프로세스 테이블을 통해 컴퓨터에서 실행되는 빈틈과 응용 프로그램을 추적합니다.Linux 커널 메모리에서 프로세스 테이블은 구조 목록으로 구성됩니다.프로세스 테이블의 각 프로세스는 목록에 항목이 있으며, 이 목록에는 프로세스에 대한 정보가 포함되어 있습니다.여기에는 PCB(프로세스 제어 블록)에 대한 포인터, 프로세스 ID 및 기타 데이터가 들어 있습니다.
Linux PCB에는 프로세스 상태, 프로세스 번호, 프로세스 카운터, 레지스터, 파일 목록 열기, CPU 스케줄링 정보, 메모리 관리 정보, 입출력 상태 정보가 포함되어 있습니다.R, S, D, T, Z 등 5가지 프로세스 상태가 있을 수 있습니다. R은 실행 중인 프로세스이고, S는 휴면 프로세스이며, D는 끊임없는 휴면 상태이며, T는 종료되거나 정지된 프로세스이며, Z는 좀비 프로세스입니다.
그렇다면 좀비의 진행 상태는 어떻게 작동합니까?zombie 프로세스 상태에서, 부모 프로세스는 하위 프로세스를 만드는 동안wait () 함수를 호출합니다.그런 다음 상태 변경이 하위 프로세스에서 발생할 때까지 기다립니다.하위 프로세스가 중지될 때 상태가 변경되면 종료 상태 코드를 읽습니다.
그런 다음 하위 프로세스의 PCB를 제거하고 항목을 지웁니다.그것은 매우 빨리 발생하여 좀비의 과정이 오래 지속되지 않을 것이다.

Linux에서 좀비 프로세스의 형성 원인


그렇다면 Linux에서 좀비 프로세스가 형성된 원인은 무엇입니까?완벽하지 않은 부모 프로세스는 하위 프로세스를 만들 때wait () 함수를 호출할 수 없습니다.따라서 하위 프로세스에서 어떤 것도 상태의 변화를 감시하지 않는다.따라서 SIGCHLD 신호는 무시됩니다.두 번째 이유는 다른 프로그램이 악의적인 의도나 간단한 엉터리 인코딩으로 인해 부모 프로세스의 실행에 영향을 미칠 수 있기 때문이다.
어쨌든 부모 프로세스가 하위 프로세스 상태 변경을 볼 수 없으면 시스템 내무 관리는 일어나지 않습니다.그런 다음 하위 프로세스가 끝나면 PCB 및 엔트리가 지워지지 않습니다.따라서 PCB에서 좀비 상태를 제거하지 않습니다.

좀비의 진행에 관한 사실


좀비의 진행에 관한 재미있는 사실들은 다음과 같다.
좀비 프로세스가 exit () 시스템 호출을 사용하면 좀비 프로세스에 분배된 모든 시스템 메모리와 다른 자원을 방출합니다.
그러나 표의 항목은 여전히 사용할 수 있다.
부모 프로세스가 실행되지 않으면 좀비 프로세스의 존재는 운영체제 오류를 나타냅니다.만약 좀비의 진행이 존재한다면, 이것은 심각한 문제를 초래하지 않을 것이다.그러나 부하가 비교적 무거운 상황에서 좀비 프로세스의 존재는 프로세스 테이블 항목이 부족할 수 있다.본고의 다음 절에서 우리는 좀비의 진행 과정의 위험을 탐구할 것이다.
부모 프로세스는wait () 함수를 사용하여 좀비 프로세스의 종료 상태를 읽습니다.그리고 시스템에서 좀비 프로세스를 제거합니다.삭제하면 프로세스 테이블 항목과 프로세스 ID를 다시 사용할 수 있습니다.
상위 레벨에서wait () 를 사용하지 않으면 좀비는 프로세스 테이블에 유지됩니다.이것은 자원 유출을 초래할 것이다.
kill 명령을 사용하여 상위 프로세스에 SIGCHLD 신호를 보내면 시스템에서 좀비 프로세스를 삭제할 수 있습니다.
좀비 프로세스가 SIGCHLD 신호를 보낸 후에도 프로세스 테이블에 남아 있다면 받아들일 수 있다면 부모 프로세스를 종료해야 합니다.

좀비의 진행이 위험합니까?


좀비 프로세스는 약간의 메모리를 사용하지만, 보통 위험을 초래하지 않는다.프로세스 테이블 항목은 매우 작지만 좀비 프로세스를 방출하기 전에 프로세스 ID를 사용할 수 없습니다.64비트 운영 체제에서는 PCB가 프로세스 테이블의 항목보다 크기 때문에 문제가 발생하지 않습니다.
대량의 좀비 프로세스는 다른 프로세스의 사용 가능한 메모리에 영향을 줄 수 있다.만약 당신이 직면한 좀비가 너무 많다면, 운영체제 오류나 아버지 응용 프로그램에 심각한 문제가 발생할 것이다.이 경우 나머지 프로세스 ID는 좀비에 의해 독점됩니다.프로세스 ID가 없으면 다른 프로세스는 실행할 수 없습니다.

어떻게 좀비 프로세스를 찾고 죽입니까


좀비를 죽이려면 먼저 찾아야 한다.아래에 제시된 코드를 사용하여 좀비 프로세스를 식별합니다.
$ ps aux | egrep "Z|defunct"
STAT 열에 사용된 Z 및/또는 마지막 출력 열에 사용된 [실효]는 좀비 프로세스를 식별합니다.
사실 너는 좀비를 죽일 수 없다. 왜냐하면 그들은 이미 죽었기 때문이다.하위 프로세스의 상태를 다시 읽을 수 있도록 부모 프로세스에 알립니다. 이 하위 프로세스는 현재 좀비 프로세스가 되었고, 최종적으로 프로세스 테이블에서 죽은 프로세스를 지울 수 있습니다.다음 명령을 사용하여 상위 프로세스 ID를 찾습니다.
$ ps -o ppid= 
좀비의 상위 프로세스 ID를 얻으면 상위 프로세스에 SIGCHLD를 보냅니다.
$ kill -s SIGCHLD 
프로세스 테이블에서 좀비 프로세스를 삭제할 수 없으면 부모 프로세스를 다시 시작하거나 종료해야 합니다.좀비의 아버지 프로세스를 죽이려면 아래 코드를 사용하십시오.
$ kill -9 
방주: 부모 프로세스를 죽이면 하위 프로세스가 영향을 받습니다.따라서 신속한 재검사를 권장한다.이것은 네가 안전을 유지하는 데 도움을 줄 것이다.
기존 좀비 프로세스가 급증하여 시스템 다운이 발생하거나 발생할 경우 시스템을 다시 시작해야 합니다.또는 소량의 좀비 프로세스가 메모리나 시스템 자원을 많이 사용하지 않았다고 가정해 보세요.이런 상황에서 현명한 방법은 다가오는 정시 시스템 유지보수에서 부모 프로세스를 다시 시작하거나 종료하는 것이다.

결론


본고에서 당신은 리눅스에서 좀비를 찾고 죽이는 방법을 배웠습니다.이제 좀비 프로세스가 무엇인지, Linux에서 좀비 프로세스를 식별하고 프로세스 테이블에서 삭제하는 방법을 알게 되었습니다.우리는 또한 절차 상태와 좀비 절차 상태의 작업 방식을 간단명료하게 탐구했다.
따라서 좀비가 제때에 정리되고 유지된다면 위험하지 않다는 결론이 나왔다.이 글은 리눅스의 좀비 프로세스에 대한 질문에 대답할 수 있는 유용하다고 생각하시기 바랍니다.