“ Zombie Process” บน Linux คืออะไร?
หากคุณเป็นผู้ใช้ลีนุกซ์คุณอาจเคยเห็นกระบวนการซอมบี้รอบรายการกระบวนการของคุณ คุณไม่สามารถฆ่ากระบวนการซอมบี้เพราะมันตายไปแล้ว - เหมือนซอมบี้จริง.
โดยทั่วไปแล้วซอมบี้เป็นบิตที่เหลือของกระบวนการที่ไม่ได้ทำความสะอาดอย่างถูกต้อง โปรแกรมที่สร้างกระบวนการซอมบี้ไม่ได้รับการโปรแกรมอย่างเหมาะสม - โปรแกรมไม่ควรปล่อยให้กระบวนการซอมบี้ติดขัด.
เครดิตรูปภาพ: Daniel Hollister บน Flickr (รีมิกซ์)
กระบวนการซอมบี้คืออะไร?
เพื่อให้เข้าใจว่ากระบวนการของซอมบี้คืออะไรและอะไรทำให้กระบวนการของซอมบี้ปรากฏขึ้นคุณจะต้องเข้าใจเกี่ยวกับการทำงานของกระบวนการบน Linux.
เมื่อกระบวนการตายบน Linux กระบวนการทั้งหมดจะไม่ถูกลบออกจากหน่วยความจำทันที - ตัวบอกกระบวนการยังคงอยู่ในหน่วยความจำ (ตัวอธิบายกระบวนการใช้หน่วยความจำเพียงเล็กน้อยเท่านั้น) สถานะของกระบวนการกลายเป็น EXIT_ZOMBIE และพาเรนต์ของกระบวนการได้รับแจ้งว่ากระบวนการลูกของมันนั้นเสียชีวิตด้วยสัญญาณ SIGCHLD กระบวนการหลักควรดำเนินการเรียกใช้ระบบ wait () เพื่ออ่านสถานะการออกของกระบวนการที่ตายแล้วและข้อมูลอื่น ๆ สิ่งนี้อนุญาตให้กระบวนการพาเรนต์รับข้อมูลจากกระบวนการที่ตายแล้ว หลังจากการรอ () ถูกเรียกกระบวนการซอมบี้จะถูกลบออกจากหน่วยความจำอย่างสมบูรณ์.
ปกติแล้วจะเกิดขึ้นอย่างรวดเร็วดังนั้นคุณจะไม่เห็นกระบวนการซอมบี้ที่สะสมอยู่ในระบบของคุณ อย่างไรก็ตามหากกระบวนการผู้ปกครองไม่ได้ตั้งโปรแกรมอย่างถูกต้องและไม่เคยรอสาย () เด็ก ๆ ของมันจะติดอยู่ในหน่วยความจำจนกว่าพวกเขาจะถูกกำจัด.
โปรแกรมอรรถประโยชน์เช่น GNOME System Monitor ด้านบน คำสั่งและ PS คำสั่งแสดงกระบวนการซอมบี้.
อันตรายจากกระบวนการซอมบี้
กระบวนการซอมบี้ไม่ได้ใช้ทรัพยากรระบบใด ๆ ทั้งสิ้น (ที่จริงแล้วแต่ละคนใช้หน่วยความจำระบบจำนวนเล็กน้อยมากเพื่อจัดเก็บตัวอธิบายกระบวนการ) อย่างไรก็ตามกระบวนการ zombie แต่ละกระบวนการยังคง ID กระบวนการ (PID) ระบบ Linux มี ID กระบวนการจำนวน จำกัด - 32767 โดยค่าเริ่มต้นในระบบ 32 บิต หากซอมบี้กำลังสะสมในอัตราที่รวดเร็วมาก - ตัวอย่างเช่นหากซอฟต์แวร์เซิร์ฟเวอร์ที่ตั้งโปรแกรมไม่ถูกต้องกำลังสร้างกระบวนการซอมบี้ภายใต้โหลด - พูลทั้งหมดของ PID ที่มีอยู่จะกลายเป็นกระบวนการซอมบี้ในที่สุด.
อย่างไรก็ตามกระบวนการซอมบี้สองสามตัวที่แขวนอยู่รอบ ๆ นั้นก็ไม่มีปัญหา - แม้ว่ามันจะบ่งบอกถึงข้อผิดพลาดของกระบวนการหลักในระบบของคุณ.
กำจัดกระบวนการซอมบี้
คุณไม่สามารถฆ่ากระบวนการซอมบี้ในขณะที่คุณสามารถฆ่ากระบวนการปกติด้วยสัญญาณ SIGKILL - กระบวนการซอมบี้นั้นตายไปแล้ว จำไว้ว่าคุณไม่จำเป็นต้องกำจัดกระบวนการซอมบี้จนกว่าคุณจะมีจำนวนมากในระบบของคุณ - ซอมบี้บางตัวไม่เป็นอันตราย อย่างไรก็ตามมีสองสามวิธีที่คุณสามารถกำจัดกระบวนการซอมบี้.
วิธีหนึ่งคือการส่งสัญญาณ SIGCHLD ไปยังกระบวนการหลัก สัญญาณนี้บอกกระบวนการหลักให้ดำเนินการเรียกใช้ระบบ wait () และทำความสะอาดลูกซอมบี้ของมัน ส่งสัญญาณด้วย ฆ่า คำสั่งการแทนที่ pid ในคำสั่งด้านล่างด้วย PID ของกระบวนการหลัก:
kill -s SIGCHLD pid
อย่างไรก็ตามหากกระบวนการหลักไม่ได้ตั้งโปรแกรมอย่างเหมาะสมและไม่สนใจสัญญาณ SIGCHLD สิ่งนี้จะไม่ช่วย คุณจะต้องฆ่าหรือปิดกระบวนการหลักของซอมบี้ เมื่อกระบวนการที่สร้างซอมบี้สิ้นสุดลง init จะทำหน้าที่สืบทอดกระบวนการซอมบี้และกลายเป็นพาเรนต์ใหม่ (init เป็นกระบวนการแรกที่เริ่มต้นบน Linux เมื่อเริ่มระบบและได้รับมอบหมาย PID 1) init เรียกใช้การเรียกของระบบ wait () เป็นระยะ ๆ เพื่อล้างลูกซอมบี้ของมันดังนั้น init จะทำงานสั้น ๆ ของซอมบี้ คุณสามารถรีสตาร์ทกระบวนการหลักหลังจากปิดได้.
หากกระบวนการหลักยังคงสร้างซอมบี้มันควรจะได้รับการแก้ไขเพื่อให้เรียกอย่างถูกต้องรอ () เพื่อเก็บเกี่ยวลูกซอมบี้ของมัน ยื่นรายงานข้อผิดพลาดหากโปรแกรมในระบบของคุณยังคงสร้างซอมบี้.