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


19

방금 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
당신은 시도 kill -9했습니까?
Ipor Sircer

7
단지 747와는 29971좀비 프로세스입니다. 다른 사람들은 잠겨 있지만 아직 죽지 않았습니다.
roaima

바람둥이에서 실행되는 일부 코드에 버그가있는 것 같습니다.
Boris the Spider

답변:


8

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이라고 표시됨).


1
실제로 kill -KILL이러한 프로세스를 닫을 수있는 유일한 명령이었습니다.이 때문에 @Alexis Wilke 답변을 수락 할 것입니다. 그러나 @heemayl에게 빠르고 현명하며 매우 유익한 답변 +1에 감사를 표하고 싶습니다. 모두에게 감사
Lese

39

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

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

kill -CHLD <PPID>

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

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


8
SIGCHLD를 부모에게 보내서 자식이 종료 된 경우 (즉, 자식 종료 상태를 수집하도록 요청하면)이 신호를 무시할 수 있음을 알릴 수 있습니다 (기본값) 프로세스가 무시 SIGCHLD하면 좀비가 없다는 것입니다 만들어 질 것입니다. 따라서 무시하지 않고 SIGCHLD좀비가 거두지 않으면 프로세스가 버그가 있거나 좀비 어린이를 신경 쓰지 않습니다. 문제의 프로세스가 있다는 것을 감안할 때 git clone ..., 나는 좀비 어린이들에게 관심이 없다고 생각합니다. 좀비 아이들은 그것이 일을하고 종료하는 (희망스럽게) 단명 한 프로세스이기 때문입니다.
Andrew Henle

1
@AndrewHenle : 대부분의 경우에 대한 기본 동작 ( SIG_DFL) SIGCHILD도 무시하지만,이 경우 좀비가 자동으로 거두지는 않습니다.
R ..

@R 그것이 사실이지만 대부분의 기본 동작 ( SIG_DFL) SIGCHILD도 무시하는 것이지만,이 경우 좀비가 자동으로 거두지는 않습니다. 무슨 말을하는지 잘 모르겠습니다. 질문에 답하지 않은 프로세스를 언급하고 있습니까? 처리기가 (명시 적으로 또는 기본적으로) 설정된 SIGCHLD프로세스로 전송 하면 해당 프로세스가 좀비를 얻는 방법 을 알 수 없습니다. SIGCHLDSIG_IGN
Andrew Henle

1
@AndrewHenle하는 보내기 SIGCHLD작동 할 수 이 시간을 . 마지막으로 신호를 놓쳤거나 두 명의 자녀가 동시에 사망했으며 코드가 두 명의 사망을 동시에 처리 할만큼 똑똑하지는 않습니다.
Alexis Wilke

상처를 줄 수는 없지만 효과가 없을 것입니다.
Barmar

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" " ")

0

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.