วิธีฆ่าซอมบี้


184

ฉันเปิดตัวโปรแกรมของฉันในเบื้องหน้า (โปรแกรม daemon) จากนั้นฉันก็ฆ่ามันด้วย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 ซึ่งจะรอและล้างรายการในตารางกระบวนการ) หาก daemon ของคุณวางไข่เด็ก ๆ ที่กลายเป็นซอมบี้คุณมีข้อบกพร่อง ภูตของคุณควรสังเกตุเมื่อลูก ๆ ของมันตายและ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
สมมติว่าคุณมีขั้นตอนการผลิตจำนวนมากของซอมบี้มันทำให้รู้สึกถึง 'UNIQ' รหัสนี้:kill $(ps -A -ostat,ppid | awk '/[zZ]/{print $2}' | sort -u)
Ankon

2
โดยปกติแล้วคุณสามารถค้นหาผู้ปกครองในPPidแถวถ้าคุณcat /proc/<pid>/status
Daniel Andrei Mincă

2
แค่คิดว่าไม่ใช่คนไอทีมาที่นี่และอ่านสิ่งนี้ บ้า.
ZitRo

68

คุณสามารถล้างกระบวนการซอมบี้โดยการฆ่ากระบวนการหลักด้วยคำสั่งต่อไปนี้:

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

6
คำสั่งนี้ล้างค่าซอมบี้ออกจากตารางกระบวนการ แต่จะไม่ 'ฆ่า' ซอมบี้ ซอมบี้ตายไปแล้ว
วิลเลียม Pursell

8
grepไม่จำเป็น ps ... | awk '/[zZ]/{print $2}'
วิลเลียม Pursell

2
AFAICS คำสั่งนี้ไม่ได้ฆ่าซอมบี้ แต่ส่ง SIGHUP ไปยังกระบวนการหลักของมัน (น่าจะฆ่าผู้ปกครองถ้ามันไม่จัดการ SIGHUP และทำให้ซอมบี้ถูก reparented เพื่อเริ่มต้นตามที่อธิบายไว้ในคำตอบก่อนหน้า) ดังนั้นระวังด้วยคำสั่งนี้มันอาจฆ่าสิ่งที่คุณไม่คาดหวังว่าจะได้ ...
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

1
ทำงานให้ฉัน สิ่งนี้จะทำงานในบางกรณีเมื่อกระบวนการที่เกิดขึ้นถูกวางไข่โดยกระบวนการที่อับละอองเกสรฆ่าตาย
Eric S. Bullington

2
ฉันตรวจสอบสิ่งที่ผู้ปกครองดำเนินการก่อนที่จะฆ่ามัน และฉันเพิ่งฆ่ามันโดยใช้ -9 แทน -1: kill -9 {รหัสผู้ปกครอง}
Ali

ฉันต้องใช้ -9 เพื่อฆ่าฉันแทน -1
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 เป็นกระบวนการหลักฆ่าพ่อแม่ของซอมบี้ทั้งหมดและซอมบี้ก็ตาย!

ตัวอย่าง

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สำหรับฉันและตอนนี้ฉันไม่สามารถทำอะไรได้และถูกบังคับให้เริ่มต้นใหม่ ... กระบวนการซอมบี้คือ Java ทำให้ 3.4GB ออกจาก 4GB of RAM
Tcll

22

ฉันเหนื่อย

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

และมันใช้งานได้สำหรับฉัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.