กระบวนการซอมบี้คืออะไร?


138

ด้วยคำสั่งเช่นtopและ gui based System Monitorฉันเห็นได้ว่าในตอนนี้ฉันมีกระบวนการซอมบี้หลายอย่าง

กระบวนการซอมบี้คืออะไร?

พวกมันมีผลกับประสิทธิภาพของระบบหรือแอพพลิเคชั่นที่พวกมันเป็นซอมบี้หรือไม่ พวกเขาใช้หน่วยความจำมากเกินไปหรือหน่วยความจำใด ๆ เลยหรือไม่?


39
พวกเขาเป็นกระบวนการที่ต้องการกินซีพียูของคุณ;)
Luis Alvarado

8
สำหรับมื้อกลางวัน ... :)
RolandiXor

3
กระบวนการเหล่านี้ตาย แต่ไม่ฝัง
Prateek Joshi

2
กินซีพียูของฉัน! มันช่างน่ากลัวจริงๆ!
Håvard Geithus

คำตอบ:


162

ซอมบี้เป็นกระบวนการที่ตายแล้ว พวกเขาไม่สามารถ 'ฆ่า' (คุณไม่สามารถฆ่า DEAD) กระบวนการทั้งหมดจะตายในที่สุดและเมื่อพวกเขากลายเป็นซอมบี้ พวกเขากินทรัพยากรแทบจะไม่มีซึ่งคาดว่าจะเป็นเพราะพวกเขาตาย! เหตุผลสำหรับซอมบี้คือพ่อแม่ของซอมบี้ (กระบวนการ) สามารถดึงสถานะการออกของซอมบี้และสถิติการใช้ทรัพยากร พาเรนต์ส่งสัญญาณระบบปฏิบัติการว่าไม่ต้องการซอมบี้อีกต่อไปโดยใช้การเรียกของระบบ wait ()

เมื่อกระบวนการตายกระบวนการลูกทั้งหมดจะกลายเป็นลูกของกระบวนการหมายเลข 1 ซึ่งเป็นกระบวนการเริ่มต้น ตอนแรกคือ `` '' เสมอรอให้เด็กตายเพื่อที่พวกเขาจะไม่คงอยู่เหมือนซอมบี้

หากคุณมีกระบวนการซอมบี้หมายความว่าซอมบี้เหล่านั้นไม่ได้รอโดยผู้ปกครอง (ดู PPID ที่แสดงโดยps -l) คุณมีสามตัวเลือก: แก้ไขกระบวนการหลัก (ทำให้รอ); ฆ่าผู้ปกครอง; หรืออยู่กับมัน โปรดจำไว้ว่าการอยู่กับมันนั้นไม่ยากนักเพราะซอมบี้ใช้สายพิเศษมากกว่าหนึ่งเส้นในเอาต์พุตของ ps

ซอมบี้สามารถระบุได้ในเอาต์พุตจากคำสั่ง Unix ps โดยมี "Z" อยู่ในคอลัมน์ STAT ซอมบี้ที่มีอยู่เป็นระยะเวลาสั้น ๆ มักจะระบุว่ามีบั๊กในโปรแกรมหลัก เช่นเดียวกับการรั่วไหลอื่น ๆ การปรากฏตัวของซอมบี้สองสามตัวนั้นไม่น่าเป็นห่วง แต่อาจบ่งบอกถึงปัญหาที่จะเพิ่มขึ้นอย่างรุนแรงภายใต้ภาระที่หนักกว่า

ในการลบซอมบี้ออกจากระบบสัญญาณ SIGCHLD สามารถส่งไปยังผู้ปกครองได้ด้วยตนเองโดยใช้คำสั่ง kill หากกระบวนการหลักยังคงปฏิเสธที่จะเก็บเกี่ยวซอมบี้ขั้นตอนต่อไปคือการลบกระบวนการหลัก เมื่อกระบวนการสูญเสียพาเรนต์ init จะกลายเป็นพาเรนต์ใหม่ ตอนแรกจะทำการเรียกระบบรอเพื่อเก็บเกี่ยวซอมบี้ใด ๆ ที่มี init เป็นผู้ปกครอง

นอกจากนี้ยังมีกระบวนการเด็กกำพร้าซึ่งเป็นกระบวนการคอมพิวเตอร์ที่มีกระบวนการหลักได้เสร็จสิ้นหรือสิ้นสุด

กระบวนการสามารถกลายเป็น orphaned ในระหว่างการร้องขอระยะไกลเมื่อกระบวนการไคลเอนต์ขัดข้องหลังจากทำการร้องขอของเซิร์ฟเวอร์

เด็กกำพร้าเสียทรัพยากรของเซิร์ฟเวอร์และอาจทำให้เซิร์ฟเวอร์มีปัญหา (นี่คือความแตกต่างของทรัพยากรที่ใหญ่ที่สุดระหว่างซอมบี้และเด็กกำพร้า (ยกเว้นถ้าคุณเห็นภาพยนตร์เด็กกำพร้าบางคน) อย่างไรก็ตามมีวิธีการแก้ปัญหาเด็กกำพร้าหลายวิธี:

  1. การกำจัดเป็นเทคนิคที่ใช้กันมากที่สุด ในกรณีนี้กระบวนการเด็กกำพร้าถูกฆ่าตาย

  2. การกลับชาติมาเกิดเป็นเทคนิคที่เครื่องจักรพยายามค้นหาผู้ปกครองของการคำนวณระยะไกลเป็นระยะ ๆ ที่จุดกำพร้ากระบวนการถูกฆ่าตาย

  3. การหมดอายุเป็นเทคนิคที่แต่ละกระบวนการได้รับการจัดสรรเวลาให้เสร็จก่อนที่จะถูกฆ่า หากจำเป็นต้องมีกระบวนการอาจ "ขอ" สำหรับเวลาให้เสร็จสิ้นก่อนเวลาที่กำหนดจะหมดอายุ

กระบวนการสามารถกำพร้าทำงานในเครื่องเดียวกับกระบวนการหลัก ในระบบปฏิบัติการที่เหมือนยูนิกซ์กระบวนการใด ๆ ที่ถูกกำพร้าจะถูกนำไปใช้ทันทีโดยกระบวนการของระบบ "init" พิเศษ การดำเนินการนี้เรียกว่าการอบรมเลี้ยงดูใหม่และเกิดขึ้นโดยอัตโนมัติ แม้ว่าในทางเทคนิคแล้วกระบวนการจะมีกระบวนการ "init" ในฐานะผู้ปกครอง แต่ก็ยังเรียกว่ากระบวนการเด็กกำพร้าตั้งแต่กระบวนการที่สร้างขึ้น แต่เดิมไม่มีอยู่แล้ว

ข้อมูลเพิ่มเติม:

http://wiki.answers.com/Q/What_is_Zombie_Process_and_Orphan_Process#ixzz1PCN9vojU

http://www.linuxsa.org.au/tips/zombies.html

http://www.brighthub.com/computing/linux/articles/79186.aspx

วิธีการระบุและฆ่ากระบวนการหยุดทำงานเมื่อระบบหยุดทำงานและตอบสนองช้าในการป้อนข้อมูลผู้ใช้

ฆ่ากระบวนการทำงานในเครื่อง Ubuntu จากระยะไกลจากเครื่อง windows ซึ่งอยู่ใน LAN


18
Ekhm! คุณสามารถฆ่าคนตาย! คุณเพียงแค่ต้องมุ่งไปที่หัว หรือว่าพวกเขาโกหกเราตลอดเวลา?
Marcin Kaminski

1
initเรียกร้องwaitให้กระบวนการของเด็กทั้งหมดไม่ว่าจะเป็นซอมบี้เด็กกำพร้า (บุญธรรม) และชีวภาพ (เลี้ยงตัวเอง)?
นิ้วเลือดออก

1
ตามมาตรฐาน ถึง World War Z ใช้การปลอมตัว: P
عثمانغني

กรุณามอบเหรียญให้กับ @MarcinKaminski!
Andrea

20

กระบวนการซอมบี้ (แสดงด้วย<defunct>) ไม่ใช่กระบวนการจริงเลย เป็นเพียงรายการในตารางกระบวนการเคอร์เนล นี่เป็นเพียงแหล่งข้อมูลเดียวที่พวกเขาบริโภค พวกเขาไม่ใช้ CPU หรือ RAM ใด ๆ อันตรายเพียงอย่างเดียวของการมีซอมบี้กำลังหมดพื้นที่ในตารางกระบวนการ (คุณสามารถใช้cat /proc/sys/kernel/threads-maxเพื่อดูจำนวนรายการที่ได้รับอนุญาตในระบบของคุณ)

พวกเขาจะปรากฏเฉพาะเมื่อกระบวนการหลักของพวกเขา (เช่นกระบวนการที่fork()'edพวกเขา) ยังมีชีวิตอยู่ แต่ยังไม่ได้เรียกwait()ฟังก์ชั่นระบบ เมื่อผู้ปกครองเสียชีวิตซอมบี้จะถูกwait()'edตามหาinitและหายไป


4
top`ภาพหน้าจอในคำถามนี้ดูเหมือนจะขัดแย้งกับคุณ? ที่นั่นซอมบี้ดูเหมือนจะใช้ 100% ของ 1 CPU แต่ไม่มีหน่วยความจำ
Torben Gundtofte-Bruun

7

เมื่อมีการchild processยุติการตายของมันจะถูกส่งไปยังผู้ปกครองเพื่อให้ผู้ปกครองสามารถดำเนินการตามความเหมาะสม

processที่รอให้ผู้ปกครองที่จะยอมรับรหัสกลับมาเรียกว่ากระบวนการผีดิบ

พวกเขามีcompleted their executionแต่ยังคงมีอยู่ในentryprocess table


1

กระบวนการซอมบี้เป็นกระบวนการที่หยุดทำงาน แต่รายการตารางกระบวนการของพวกเขายังคงมีอยู่เพราะกระบวนการหลักไม่ได้ดึงข้อมูลผ่านการรอ syscall ในทางเทคนิคแต่ละกระบวนการที่ยุติเป็นซอมบี้ในช่วงเวลาสั้น ๆ แต่พวกเขาสามารถมีชีวิตอยู่ได้นานขึ้น

กระบวนการซอมบี้ที่อาศัยอยู่อีกต่อไปเกิดขึ้นเมื่อกระบวนการหลักไม่เรียกรอ syscall หลังจากกระบวนการลูกเสร็จ สถานการณ์หนึ่งที่สิ่งนี้เกิดขึ้นคือเมื่อกระบวนการพาเรนต์เขียนไม่ดีและเพียงละเว้นการรอสายหรือเมื่อกระบวนการพาเรนต์ตายก่อนที่ลูกและกระบวนการพาเรนต์ใหม่จะไม่เรียกรอ เมื่อผู้ปกครองของกระบวนการตายก่อนที่เด็กระบบปฏิบัติการจะกำหนดกระบวนการเด็กให้กับกระบวนการ "init" หรือ PID 1 นั่นคือกระบวนการเริ่มต้น "ใช้" กระบวนการเด็กและกลายเป็นผู้ปกครอง ซึ่งหมายความว่าตอนนี้เมื่อกระบวนการลูกออกจากพาเรนต์ใหม่ (init) ต้องเรียก waitto เพื่อรับรหัสทางออกหรือรายการตารางกระบวนการจะคงอยู่ตลอดไปและจะกลายเป็นซอมบี้

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