좀비 프로세스를 죽이는 또 다른 방법

좀비 프로세스를 죽이는 또 다른 방법

방금 CentOS 6.8(Final)에서 일부 좀비 프로세스를 발견하고 종료하려고 시도했지만 여전히 존재합니다.

[root@host user]# ps -ef | grep git
tomcat     746     1  0 Jul18 ?        00:00:00 git clone https://github.com/angular/bower-angular.git -b v1.3.20 --progress . --depth 1
tomcat     747   746  0 Jul18 ?        00:00:00 [git-remote-http] <defunct>
root     20776 20669  0 09:03 pts/3    00:00:00 grep git
tomcat   29970     1  0 Jul18 ?        00:00:00 git clone https://github.com/components/jqueryui.git -b 1.12.0 --progress . --depth 1
tomcat   29971 29970  0 Jul18 ?        00:00:00 [git-remote-http] <defunct>

[root@host user]# kill 746 747 29970 29971

[root@host user]# ps -ef | grep git
tomcat     746     1  0 Jul18 ?        00:00:00 git clone https://github.com/angular/bower-angular.git -b v1.3.20 --progress . --depth 1
tomcat     747   746  0 Jul18 ?        00:00:00 [git-remote-http] <defunct>
root     21525 20669  0 09:26 pts/3    00:00:00 grep git
tomcat   29970     1  0 Jul18 ?        00:00:00 git clone https://github.com/components/jqueryui.git -b 1.12.0 --progress . --depth 1
tomcat   29971 29970  0 Jul18 ?        00:00:00 [git-remote-http] <defunct>

보시다시피 두달째 운영되고 있는데 무해하다면 저도 제거하겠습니다. 좀비를 죽일 수 있는 다른 방법은 없을까요?

답변1

좀비(프로세스)는 죽일 수 없습니다. 좀비는 이미 죽었기 때문입니다. 단지 상위 프로세스가 실행되어 wait(2)종료 상태를 수집할 때까지 기다립니다. 프로세스 테이블 항목을 제외하고는 시스템의 어떤 리소스도 차지하지 않습니다.

SIGCHLD자식 중 하나가 종료되었음을 알리기 위해 부모에게 보낼 수 있습니다 (즉, 자식의 종료 상태를 수집하도록 요청). 이 신호는 무시할 수 있습니다(기본값).

kill -CHLD <PPID>

( <PPID>부모의 실제 PID로 대체합니다.)

init또는 (PID 1)이 좀비 프로세스를 상속하고 올바르게 가져오도록 상위 프로세스를 종료할 수 있습니다 ( init고아 프로세스를 상속하고 wait(2)주기적으로 실행하는 것이 주요 작업 중 하나입니다). 그러나 부모를 죽이는 것은 권장되지 않습니다. 일반적으로 좀비 프로세스 생성은 수정하거나 보고해야 하는 프로그래밍 문제를 나타냅니다.

답변2

Heemayl이 말했듯이 실제로 좀비를 죽일 수는 없습니다. 이미 죽었어...

그러나 직면하고 있는 문제는 명령에 문제가 있는 것 같습니다 git clone. 어떻게 든 붙어 있습니다. 시간이 초과되거나 실패할 수 있나요? 일부 I/O로 인해 프로세스가 SIGTERM작동할 수 없는 지점 에서 멈추는 경우가 많습니다 SIGINT.

-9이 경우 이를 종료하려면 명령줄 옵션을 사용해야 합니다 . SIGKILL신호를 보낸다는 뜻이다 . 사실, 당신 -KILL도 그것을 사용할 수 있습니다.

[root@host user]# kill -KILL 746 29970

사용 가능한 신호 목록을 얻으려면 list 명령줄 옵션을 사용하십시오.

[root@host user]# kill -l

그러면 번호와 이름이 표시됩니다(#9는 SIGKILL을 의미함).

답변3

좀비 프로세스 찾기:

ps aux | grep -w Z | grep -v grep

ps -eo stat,ppid | grep -w Z

좀비 프로세스를 종료하려면 PPID인 상위 ID를 종료해야 합니다.

kill PPID1 PPID2

kill $(ps -eo stat,ppid|grep -w Z|awk '{print $2}'|tr "\n" " ")

답변4

상위 프로세스가 종료되면 모든 좀비 프로세스가 정리됩니다. 단지 좀비 프로세스를 정리하기 위해 상위 프로세스를 종료하지 마십시오. 프로그램을 다시 실행하면 다시 나타납니다. "wait()" 또는 "waitpid()" 시스템 호출을 올바르게 호출하여 프로그램을 수정하세요.

관련 정보