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

방금 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>

보시다시피 두 달 동안 실행되고 있으며 해롭지 않으면 좀비를 제거하는 다른 방법은 없습니까?



답변

Heemayl이 언급했듯이 실제로 좀비를 죽일 수는 없습니다. 벌써 죽었어 …

그러나 겪고있는 문제는 git clone명령에 문제가있는 것 같습니다 . 어떻게 든 붙어 있습니다. 다른 방법으로 시간이 초과되거나 실패합니까? 그것은 프로세스가 A 지점에 붙어 가져옵니다 때문에 일부 I / O의 자주 SIGTERMSIGINT하지 않습니다 작동합니다.

이를 종료하려면 -9명령 행 옵션 을 사용하십시오 . 이것은 SIGKILL신호를 보내는 것을 의미합니다 . 실제로 사용할 수도 -KILL있습니다.

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

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

[root@host user]# kill -l

숫자와 이름이 표시됩니다 (# 9에서 SIGKILL이라고 표시됨).


답변

당신은 좀비를 죽일 수 없습니다 (프로세스), 이미 죽었습니다. 상위 프로세스가 수행 wait(2)하고 종료 상태를 수집 하기를 기다리고 있습니다. 프로세스 테이블 항목 이외의 다른 시스템 리소스는 사용하지 않습니다.

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

kill -CHLD <PPID>

( <PPID>부모의 실제 PID로 교체하십시오 .)

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


답변

좀비 프로세스를 찾기 위해 :

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

ps -eo stat,ppid | grep -w Z

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

kill PPID1 PPID2

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

답변

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