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


184

포 그라운드에서 프로그램을 시작한 후 (데몬 프로그램)으로 프로그램을 종료 kill -9했지만 좀비가 남아서으로 프로그램을 종료 할 수 없습니다 kill -9. 좀비 프로세스를 죽이는 방법?

좀비가 죽은 프로세스 (이미 종료) 인 경우 ps aux? 의 출력에서 ​​제거하는 방법은 무엇입니까?

root@OpenWrt:~# anyprogramd &
root@OpenWrt:~# ps aux | grep anyprogram
 1163 root      2552 S    anyprogramd
 1167 root      2552 S    anyprogramd
 1169 root      2552 S    anyprogramd
 1170 root      2552 S    anyprogramd
10101 root       944 S    grep anyprogram
root@OpenWrt:~# pidof anyprogramd
1170 1169 1167 1163
root@OpenWrt:~# kill -9 1170 1169 1167 1163
root@OpenWrt:~# ps aux |grep anyprogram
 1163 root         0 Z    [anyprogramd]
root@OpenWrt:~# kill -9 1163
root@OpenWrt:~# ps aux |grep anyprogram
 1163 root         0 Z    [anyprogramd]

2
무엇합니까 ps -o ppid 1163말은? 즉, 1163의 부모는 누구입니까? 이것이 종료되어야하는 프로세스입니다.
윌리엄 Pursell

답변:


250

좀비는 이미 죽었으므로 죽일 수 없습니다. 좀비를 청소하려면 부모가 기다려야하므로 부모를 죽이면 좀비를 제거해야합니다. (부모가 죽은 후에는 좀비가 pid 1에 의해 상속되어 대기하고 프로세스 테이블에서 해당 항목을 지 웁니다.) 데몬이 좀비가되는 자식을 생성하는 경우 버그가 있습니다. 데몬은 자식이 언제 죽었는지 알면서 wait종료 상태를 확인해야합니다.

좀비의 부모 인 모든 프로세스에 신호를 보내는 방법의 예 (이것은 매우 조잡하고 의도하지 않은 프로세스를 죽일 수 있습니다. 이런 종류의 썰매 망치를 사용하지 않는 것이 좋습니다) :

# Don't do this.  Incredibly risky sledge hammer!
kill $(ps -A -ostat,ppid | awk '/[zZ]/ && !a[$2]++ {print $2}')

1
좀비가 죽은 프로세스 (이미 종료) 인 경우 ps aux? 의 출력에서 ​​제거하는 방법은 무엇입니까?
MOHAMED

186
좀비는 부모가 기다려야합니다. 부모를 찾아 왜 부모가 자녀들에게 관심을 기울이지 않는지 알아 낸 다음 사회 복지 서비스에 불만을 제기하십시오. ;)
William Pursell

1
많은 좀비를 생산하는 프로세스를 가정하면 ID를 ' kill $(ps -A -ostat,ppid | awk '/[zZ]/{print $2}' | sort -u)
고유

2
일반적으로 다음과 같은 경우 부모를 찾을 수 PPid있습니다.cat /proc/<pid>/status
Daniel Andrei Mincă

2
IT가 아닌 사람들이 여기 와서 이것을 읽는다고 상상했습니다. 미친.
ZitRo

68

다음 명령으로 상위 프로세스를 종료하여 좀비 프로세스를 정리할 수 있습니다.

kill -HUP $(ps -A -ostat,ppid | grep -e '[zZ]'| awk '{ print $2 }')

6
이 명령은 프로세스 테이블에서 좀비를 지우지 만 좀비를 죽이지 않습니다. 좀비는 이미 죽었습니다.
William Pursell

8
grep필요하지 않습니다. ps ... | awk '/[zZ]/{print $2}'
William Pursell

2
AFAICS의 경우이 명령은 좀비를 죽이지 않지만 SIGHUP을 상위 프로세스로 보냅니다 (SIGHUP을 처리하지 않으면 부모를 종료하고 이전 답변에서 설명한대로 좀비를 초기화하도록 부모로 설정). 따라서이 명령에주의를 기울이면 예상하지 못한 것을 죽일 수 있습니다.
Matthijs Kooijman

1
이것은 나를 위해 작동하지 않았습니다. 나는 "kill -HUP processID"를했는데 프로세스는 여전히 좀비로 존재합니다
kommradHomer

1
@WilliamPursell 질문에 대답 할 때 명령 줄을 사용한 결과와 컴퓨터에서 실행중인 모든 프로그램이 종료되므로 명시 적으로 수행하는 작업에 대해 설명하십시오.
Dalek

39

나는 시도했다 :

ps aux | grep -w Z   # returns the zombies pid
ps o ppid {returned pid from previous command}   # returns the parent
kill -1 {the parent id from previous command}

이것은 작동합니다 :)


내 경우에는 좀비가 시작 스크립트와 명확하게 제거되지 않은 프로그램을 통해 작성되었으므로 제거했습니다.
Mohammad Rafiee 5

1
나를 위해 일했다. 이것은 폐기 된 프로세스가 다른 프로세스로 인해 소멸 된 프로세스 인 경우에 유효합니다.
Eric S. Bullington

2
부모 프로세스를 종료하기 전에 확인했습니다. 그리고 방금 -1 대신 -9를 사용하여 죽였습니다. kill -9 {부모 ID}
Ali

나는 또한 -1 대신에 -9 대신 내 것을 죽여야했다
Michael Smith

27

http://www.linuxquestions.org/questions/suse-novell-60/howto-kill-defunct-processes-574612/ 에서 찾았습니다 .

2) 다른 사용자의 유용한 팁 (Thxs Bill Dandreta) : 때때로

kill -9 <pid>

프로세스를 종료하지 않습니다. 운영

ps -xal

네 번째 필드는 부모 프로세스이며, 좀비의 부모와 좀비 모두를 죽입니다!

4 0 18581 31706 17 0 2664 1236 wait S ? 0:00 sh -c /usr/bin/gcc -fomit-frame-pointer -O -mfpmat
4 0 18582 18581 17 0 2064 828 wait S ? 0:00 /usr/i686-pc-linux-gnu/gcc-bin/3.3.6/gcc -fomit-fr
4 0 18583 18582 21 0 6684 3100 - R ? 0:00 /usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.6/cc1 -quie

18581, 18582, 18583좀비는 -

kill -9 18581 18582 18583

효과가 없습니다.

kill -9 31706

좀비를 제거합니다.


3
아니라 단지 죽였다 init나를 위해, 지금은 아무것도 할 수 없어 다시 시작을 강요하고 ... 좀비 프로세스는 자바 4GB의 RAM에서 3.4GB를 가지고있다
Tcll

22

나는 시도했다

kill -9 $(ps -A -ostat,ppid | grep -e '[zZ]'| awk '{ print $2 }')

그리고 그것은 나를 위해 작동합니다.

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