loader

“ Zombie Process” บน Linux คืออะไร?

Anonim

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

โดยทั่วไปแล้วซอมบี้เป็นบิตที่เหลือของกระบวนการที่ไม่ได้ทำความสะอาดอย่างถูกต้อง โปรแกรมที่สร้างกระบวนการซอมบี้ไม่ได้รับการโปรแกรมอย่างเหมาะสม - โปรแกรมไม่ควรปล่อยให้กระบวนการซอมบี้ติดขัด

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

เพื่อให้เข้าใจว่ากระบวนการของซอมบี้คืออะไรและอะไรทำให้กระบวนการของซอมบี้ปรากฏขึ้นคุณจะต้องเข้าใจเกี่ยวกับการทำงานของกระบวนการบน Linux

เมื่อกระบวนการตายบน Linux กระบวนการทั้งหมดจะไม่ถูกลบออกจากหน่วยความจำทันที - ตัวบอกกระบวนการยังคงอยู่ในหน่วยความจำ (ตัวอธิบายกระบวนการใช้หน่วยความจำเพียงเล็กน้อยเท่านั้น) สถานะของกระบวนการกลายเป็น EXIT_ZOMBIE และพาเรนต์ของกระบวนการได้รับแจ้งว่ากระบวนการลูกของมันนั้นเสียชีวิตด้วยสัญญาณ SIGCHLD กระบวนการหลักควรดำเนินการเรียกใช้ระบบ wait () เพื่ออ่านสถานะการออกของกระบวนการที่ตายแล้วและข้อมูลอื่น ๆ สิ่งนี้อนุญาตให้กระบวนการพาเรนต์รับข้อมูลจากกระบวนการที่ตายแล้ว หลังจากการรอ () ถูกเรียกกระบวนการซอมบี้จะถูกลบออกจากหน่วยความจำอย่างสมบูรณ์

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

โปรแกรมอรรถประโยชน์ต่าง ๆ เช่น GNOME System Monitor คำสั่ง ด้านบน และคำสั่ง ps แสดงกระบวนการซอมบี้

อันตรายจากกระบวนการซอมบี้

กระบวนการซอมบี้ไม่ได้ใช้ทรัพยากรระบบใด ๆ ทั้งสิ้น (ที่จริงแล้วแต่ละคนใช้หน่วยความจำระบบจำนวนเล็กน้อยมากเพื่อจัดเก็บตัวอธิบายกระบวนการ) อย่างไรก็ตามกระบวนการ zombie แต่ละกระบวนการยังคง ID กระบวนการ (PID) ระบบ Linux มี ID กระบวนการจำนวน จำกัด - 32767 โดยค่าเริ่มต้นในระบบ 32 บิต หากซอมบี้กำลังสะสมในอัตราที่รวดเร็ว - ตัวอย่างเช่นหากซอฟต์แวร์เซิร์ฟเวอร์ที่ตั้งโปรแกรมไม่ถูกต้องกำลังสร้างกระบวนการซอมบี้ภายใต้โหลด - พูลทั้งหมดของ PID ที่มีอยู่จะกลายเป็นกระบวนการซอมบี้ในที่สุด

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

กำจัดกระบวนการซอมบี้

คุณไม่สามารถฆ่ากระบวนการซอมบี้ในขณะที่คุณสามารถฆ่ากระบวนการปกติด้วยสัญญาณ SIGKILL - กระบวนการซอมบี้นั้นตายไปแล้ว จำไว้ว่าคุณไม่จำเป็นต้องกำจัดกระบวนการซอมบี้จนกว่าคุณจะมีจำนวนมากในระบบของคุณ - ซอมบี้บางตัวไม่เป็นอันตราย อย่างไรก็ตามมีสองสามวิธีที่คุณสามารถกำจัดกระบวนการซอมบี้

วิธีหนึ่งคือการส่งสัญญาณ SIGCHLD ไปยังกระบวนการหลัก สัญญาณนี้บอกให้ผู้ปกครองดำเนินการเรียกระบบ () และรอการล้างลูก ๆ ของมัน ส่งสัญญาณด้วยคำสั่ง kill แทนที่ pid ในคำสั่งด้านล่างด้วย PID ของกระบวนการหลัก:

kill -s SIGCHLD pid

อย่างไรก็ตามหากกระบวนการหลักไม่ได้ตั้งโปรแกรมอย่างเหมาะสมและไม่สนใจสัญญาณ SIGCHLD สิ่งนี้จะไม่ช่วย คุณจะต้องฆ่าหรือปิดกระบวนการหลักของซอมบี้ เมื่อกระบวนการที่สร้างซอมบี้สิ้นสุดลง init จะทำหน้าที่สืบทอดกระบวนการซอมบี้และกลายเป็นพาเรนต์ใหม่ (init เป็นกระบวนการแรกที่เริ่มต้นบน Linux เมื่อเริ่มระบบและได้รับมอบหมาย PID 1) init เรียกใช้การเรียกของระบบ wait () เป็นระยะ ๆ เพื่อล้างข้อมูลซอมบี้เด็ก ๆ คุณสามารถรีสตาร์ทกระบวนการหลักหลังจากปิดได้

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