Linux의 할로윈 : 좀비 프로세스를 죽이는 방법

할로윈 스탬프

죽음의 날이 다가오고 있습니다. 그래서 LxA에서이 작은 튜토리얼을 통해 좀비 프로세스 그리고 어떻게 그들을 죽일 수 있는지. 가장 먼저 말해야 할 것은 좀비 프로세스가 무엇인지, 즉 여러분이 아시다시피 Linux 커널에는 프로세스를 관리하는 하위 시스템이 있으며 스케줄러와 함께 작동하여 CPU 처리 흐름을 생성, 변경, 전송 또는 제거하고 프로세스를 종료합니다. 음, 커널의이 부분은 나머지 유닉스 계열 시스템과 마찬가지로 다양한 프로세스 상태를 구별합니다.

그래서 우리는 과정 수면 (S) 상태, 즉 수면 상태 일 수 있습니다. 또한 현재 실행 중이거나 실행중인 프로세스 인 실행 상태 (R), 참석 대기 중 중지 된 프로세스 (D), gestpt (T) 또는 일시 중단 된 프로세스, 좀비 (Z) 또는 사망 한 프로세스도 있습니다. 좀비 또는 데드 프로세스는 이미 성공적으로 종료되었지만 Linux가 프로세스 테이블에 계속 저장하고 있기 때문에 특정 시스템 리소스가 하이재킹 된 프로세스입니다. 프로세스가 종료 될 때이 상태를 유지해서는 안되지만 완료되고 커널이 리소스를 해제하여 다른 프로세스가 리소스를 사용할 수 있다는 것을 이미 알고 있습니다. 기본적으로 점유 된 RAM을 해제합니다.

글쎄요, 이런 종류의 좀비 프로세스를 갖는 것은 흥미롭지 않기 때문에, 자주는 아니지만 여기에 표시된대로 검색하고 제거 할 수 있습니다. 첫 번째는 배포판에 좀비 프로세스가 있는지 확인하고이를 위해 스스로 도울 수 있는지 확인하는 것입니다. top 또는 ps와 같은 도구. 예를 들어 다음 두 옵션 중 하나입니다.

ps -el | grep 'Z'

ps aux | grep defunct

감지되면 그를 죽여 직접 :

kill -HUP `ps -A -ostat,ppid,pid,cmd | grep -e ‘^[Zz]’ | awk ‘{print $2}’`

또 다른 대안은 상위 프로세스를 찾는 것입니다. 좀비 프로세스를 죽이다 다음과 같이 추론했을 수 있으므로이를 유지하는 상위 프로세스를 종료해야합니다.

ps -eo pid,ppid | grep <PID>

kill -9 <PPID>

교체해야합니다. 발견 한 좀비 프로세스의 ID로 죽이고 죽이기 위해 죽이려면 부모 프로세스의 ID를 사용하여 예에서 분명히.


코멘트를 남겨주세요

귀하의 이메일 주소는 공개되지 않습니다. 필수 필드가 표시되어 있습니다 *

*

*

  1. 데이터 책임자: AB Internet Networks 2008 SL
  2. 데이터의 목적 : 스팸 제어, 댓글 관리.
  3. 합법성 : 귀하의 동의
  4. 데이터 전달 : 법적 의무에 의한 경우를 제외하고 데이터는 제 XNUMX 자에게 전달되지 않습니다.
  5. 데이터 저장소 : Occentus Networks (EU)에서 호스팅하는 데이터베이스
  6. 권리 : 귀하는 언제든지 귀하의 정보를 제한, 복구 및 삭제할 수 있습니다.

  1.   만든 공

    좋은 사이트!
    그들은 항상 우리를 곤경에서 구해냅니다.

    어디에 말한다 :
    다른 대안은 부모 프로세스를 찾는 것이지만, 좀비 프로세스를 종료하려면 이를 지원하는 부모 프로세스를 종료해야 하므로 다음과 같이 추론할 수 있습니다.

    1 | 추신 -eo pid, ppid | 그렙
    2|
    3 | 죽이 -9

    발견한 좀비 프로세스의 ID를 대체해야 하고 kill로 죽이려면 예제에서 대체하는 상위 프로세스의 ID를 당연히 사용해야 합니다.

    스크립트를 추가할 수 있습니다.

    $ 고양이 killppid.sh
    #! / bin / bash
    kill -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $ 2}')

    물론 일반 사용자가 맨날 하는 작업은 아닙니다.
    관리자에게만 유용하지만 시스템의 모든 프로세스를 종료할 수 있으므로 루트로 실행하는 것은 위험합니다.

    man kill에는 다음과 같은 메모가 있습니다.

    참고 쉘(명령줄 해석기)에는 내장 kill 명령이 있을 수 있습니다. 당신은 할 수있다
    충돌을 해결하려면 여기에 설명된 명령을 / bin / kill로 실행해야 합니다.

    Bash에는 해당 명령이 있습니다. 이것은 이에 대한 man bash의 일부입니다.

    kill [-s sigspec | -n 시그넘 | -sigspec] [pid | 작업 스펙] ...
    kill -l | -L [sigspec | exit_status]
    sigspec 또는 signum으로 명명된 신호를 pid 또는 job으로 명명된 프로세스로 보냅니다.
    투기. sigspec은 SIGKILL(또는
    SIG 접두사 제외) 또는 신호 번호 signum은 신호 번호입니다. 만약에
    sigspec이 없으면 SIGTERM이 가정됩니다. -l의 인수는 다음을 나열합니다.
    신호 이름. -l이 제공될 때 인수가 제공되면
    인수에 해당하는 신호가 나열되고 반환 상태는 0입니다.
    -l에 대한 exit_status 인수는 신호 번호 또는
    시그널에 의해 종료된 프로세스의 종료 상태. -L 옵션은 동일합니다.
    -l에게 빌려주었다. 적어도 하나의 신호가 성공적으로 전송되면 kill이 true를 반환하거나
    오류가 발생하거나 잘못된 옵션이 발생하면 false입니다.

    처음에는 bash가 프로세스를 보호하여 일부 문제를 방지하는 방법을 설명하지만 루트로 실행되는 안전한 스크립트를 만드는 방법이 명확하지 않습니다.
    내가 생각할 수있는 유일한 것은 다음과 같이 보호하는 것입니다.

    $ 고양이 killppid.sh
    #! / bin / bash
    [$ 사용자 == "루트"]인 경우
    then echo $0 을 루트로 실행하지 마세요!!! 위험 해요!
    출구
    fi

    kill -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $ 2}')

    $

    / bin / kill이 아닌 bash의 kill을 사용하십시오.

    내가 bash에 정통하지 않다는 것을 어떻게 알 수 있습니까?
    루트로 실행되더라도 자식 프로세스의 사용자로 실행되는 보안 스크립트를 작성하는 방법을 알고 있습니까?
    다음과 같이 수동으로 수행할 작업과 동일한 것:

    $ 수;
    $ kill -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $ 2}')