โฮมเพจ » ทำอย่างไร » “ Zombie Process” บน Linux คืออะไร?

    “ 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 จะทำงานสั้น ๆ ของซอมบี้ คุณสามารถรีสตาร์ทกระบวนการหลักหลังจากปิดได้.

    หากกระบวนการหลักยังคงสร้างซอมบี้มันควรจะได้รับการแก้ไขเพื่อให้เรียกอย่างถูกต้องรอ () เพื่อเก็บเกี่ยวลูกซอมบี้ของมัน ยื่นรายงานข้อผิดพลาดหากโปรแกรมในระบบของคุณยังคงสร้างซอมบี้.