linux จัดการกระบวนการซอมบี้อย่างไร


12

กระบวนการซอมบี้สร้างขึ้นในระบบ Unix / Linux เราสามารถลบออกได้ผ่านkillคำสั่ง

แต่จะมีกลไกการล้างข้อมูลในตัวใน Linux เพื่อจัดการกับกระบวนการซอมบี้หรือไม่?

คำตอบ:


18

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

กระบวนการซอมบี้ไม่ใช่กระบวนการจริงๆมันเป็นเพียงรายการในตารางกระบวนการ ไม่มีทรัพยากรอื่น ๆ ที่เกี่ยวข้องกับกระบวนการ zombie: ไม่มีหน่วยความจำหรือรหัสที่ทำงานอยู่ไม่มีการเปิดไฟล์ใด ๆ ฯลฯ

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

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


6

คุณไม่ใช่killกระบวนการซอมบี้เพราะมันตายไปแล้ว

waitพ่อแม่จะต้องดำเนินการกระบวนการซอมบี้เพื่อที่จะได้รับสถานะการออก

"กลไกการล้างข้อมูลในตัวเท่านั้น" ที่มีใน Linux ใช้งานได้กับกรณีที่กระบวนการหลักใด ๆ ตายก่อนที่จะรวบรวมสถานะการออกของเด็ก ในกรณีนี้เด็กแต่ละคนได้รับมรดกโดยinitกระบวนการซึ่งจะwaitอยู่ในเด็กรวบรวมสถานะการออกและลบรายการในตารางกระบวนการ


3

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


1
ไม่แม่นยำinitไม่ฆ่ากระบวนการใด ๆ มี แต่waitเด็ก ๆ เท่านั้นที่จะรวบรวมสถานะได้
chrk

1
@chrk, ฟิลิปป์: ระยะตามปกติคือเก็บเกี่ยว
Gilles 'หยุดความชั่วร้าย' ใน

1

ไม่ไม่มีกลไกการทำความสะอาดสำหรับซอมบี้ ซอมบี้ไปสู่สวรรค์ของซอมบี้เมื่อผู้ปกครองถูกฆ่าตาย จนกว่าจะถึงตอนนั้นระบบปฏิบัติการยังคงให้พวกเขากลับสถานะทางออกไปยังผู้ปกครอง


ดังนั้น .. มันไม่ได้มีผลกระทบเชิงลบของหน่วยความจำ ฯลฯ เหรอ?

1
อันที่จริงเมื่อผู้ปกครองของซอมบี้ตายinitกระบวนการจะใช้เวลาและจะเรียกwaitมันว่า

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