กระบวนการซอมบี้จะไม่มีผลกระทบต่อประสิทธิภาพหรือความล่าช้าเนื่องจากกระบวนการซอมบี้จะไม่ใช้ทรัพยากรระบบใด ๆ
หมายเหตุ: - ใน ทางปฏิบัติมันยังคงใช้ PID (ซึ่งเป็นทรัพยากรที่ จำกัด ) และโครงสร้างข้อมูลเคอร์เนลสำหรับกระบวนการยังคงถูกจัดสรร โดยปกติแล้วสิ่งนี้จะไม่สำคัญมากนัก แต่การใช้หน่วยความจำเคอร์เนลอาจมีความสำคัญกับระบบที่มีหน่วยความจำ จำกัด มาก
ปัญหาที่เกิดจากกระบวนการซอมบี้
แต่ละกระบวนการซอมบี้เก็บรหัสกระบวนการของมัน ระบบ Linux มี ID กระบวนการจำนวน จำกัด - 32767โดยค่าเริ่มต้นในระบบ 32 บิตหากซอมบี้สะสมในอัตราที่รวดเร็วมากพูลทั้งหมดของ PID ที่มีอยู่จะถูกกำหนดให้กับกระบวนการซอมบี้ในที่สุดป้องกันไม่ให้กระบวนการอื่นเปิดตัว
หมายเหตุ : สำหรับระบบ 64 บิตคุณสามารถเพิ่ม PID สูงสุดได้ที่/unix//a/16884/170373
อย่างไรก็ตามกระบวนการซอมบี้สองสามอันที่แขวนอยู่รอบ ๆ นั้นไม่มีปัญหา - แม้ว่าพวกมันจะบ่งบอกถึงข้อผิดพลาดกับกระบวนการหลักในระบบของคุณ
คำอธิบาย:
เมื่อกระบวนการตายบน Linux กระบวนการทั้งหมดจะไม่ถูกลบออกจากหน่วยความจำทันที - กระบวนการของกระบวนการจะยังคงอยู่ในหน่วยความจำ
สถานะของกระบวนการจะกลายเป็นEXIT_ZOMBIE
และผู้ปกครองของกระบวนการจะได้รับแจ้งว่ากระบวนการลูกของมันเสียชีวิตด้วยSIGCHLD
สัญญาณ
กระบวนการหลักควรดำเนินการเรียกใช้ระบบ wait () เพื่ออ่านสถานะการออกของกระบวนการที่ตายแล้วและข้อมูลอื่น ๆ สิ่งนี้อนุญาตให้กระบวนการพาเรนต์รับข้อมูลจากกระบวนการที่ตายแล้ว หลังจากการรอ () ถูกเรียกกระบวนการซอมบี้จะถูกลบออกจากหน่วยความจำอย่างสมบูรณ์
ปกติแล้วจะเกิดขึ้นอย่างรวดเร็วดังนั้นคุณจะไม่เห็นกระบวนการซอมบี้สะสมในระบบของคุณ อย่างไรก็ตามหากกระบวนการผู้ปกครองไม่ได้ตั้งโปรแกรมอย่างถูกต้องและไม่เคยรอสาย () เด็ก ๆ ของมันจะติดอยู่ในหน่วยความจำจนกว่าพวกเขาจะทำความสะอาด
ความละเอียด:
คุณไม่สามารถฆ่ากระบวนการซอมบี้ในขณะที่คุณสามารถฆ่ากระบวนการปกติด้วยสัญญาณ SIGKILL - กระบวนการซอมบี้นั้นตายไปแล้ว
วิธีหนึ่งในการฆ่าซอมบี้คือการส่งสัญญาณ SIGCHLD ไปยังกระบวนการหลัก สัญญาณนี้บอกกระบวนการหลักให้ดำเนินการเรียกใช้ระบบ wait () และทำความสะอาดลูกซอมบี้ของมัน ส่งสัญญาณด้วยคำสั่ง kill แทนที่ pid ในคำสั่งด้านล่างด้วย PID ของกระบวนการหลัก:
kill -s SIGCHLD pid
เมื่อกระบวนการที่สร้างซอมบี้สิ้นสุดลง init จะทำหน้าที่สืบทอดกระบวนการซอมบี้และกลายเป็นพาเรนต์ใหม่ (init เป็นกระบวนการแรกที่เริ่มต้นบน Linux เมื่อบูตและกำหนด PID 1)
หมายเหตุ: -จากกระบวนการ Linux 3.4 เป็นต้นไปสามารถออกการเรียกระบบ prctl () ด้วยตัวเลือก PR_SET_CHILD_SUBREAPER และด้วยเหตุนี้กระบวนการเหล่านี้ไม่ใช่กระบวนการ # 1 จะกลายเป็นพาเรนต์ของกระบวนการสืบทอดที่สืบทอดกันมา อ้างอิง: /unix//a/177361/5132
INIT จะดำเนินการเรียกใช้ระบบ wait () เพื่อล้างลูกซอมบี้ของมันดังนั้น init จะทำงานสั้น ๆ ของซอมบี้ คุณสามารถรีสตาร์ทกระบวนการหลักหลังจากปิดได้