คำว่า "subreaper" ถูกใช้ในบางคำตอบ การค้นหา Google ยังเปิดรายการที่คำว่า "เพิ่งใช้"
ฉันจะเข้าใจได้อย่างไรว่า "subreaper" คืออะไร?
คำว่า "subreaper" ถูกใช้ในบางคำตอบ การค้นหา Google ยังเปิดรายการที่คำว่า "เพิ่งใช้"
ฉันจะเข้าใจได้อย่างไรว่า "subreaper" คืออะไร?
คำตอบ:
นี้ถูกนำมาใช้กับลินุกซ์เคอร์เนล 3.4เป็นธงของการโทรระบบprctl ()
จากprctl(2)
manpage:
[... ] Subreaper เติมเต็มบทบาทของ
init(1)
กระบวนการสืบทอด เมื่อการยุติกระบวนการที่ถูกกำพร้า (กล่าวคือผู้ปกครองทันทีได้สิ้นสุดลงแล้ว) และทำเครื่องหมายว่ามี subreaper ส่วนย่อยที่อยู่ใกล้ที่สุดของบรรพบุรุษที่ยังมีชีวิตอยู่จะได้รับSIGCHLD
สัญญาณและสามารถค้นหาwait(2)
กระบวนการสิ้นสุดสถานะได้
กระบวนการสามารถกำหนดตัวเองเป็น subreaper prctl(PR_SET_CHILD_SUBREAPER)
ด้วย ถ้าเป็นเช่นนั้นก็ไม่ได้init
(PID 1) ที่จะกลายเป็นแม่ของกำพร้ากระบวนการที่เด็กแทนปู่ย่าตายายที่อาศัยอยู่ใกล้ที่สุดที่ถูกทำเครื่องหมายเป็น subreaper จะกลายเป็นผู้ปกครองใหม่ ถ้าไม่มีปู่ย่าตายายที่อยู่อาศัยinit
ไม่
เหตุผลที่จะใช้กลไกนี้ก็คือว่าผู้จัดการบริการ userspace / ผู้บังคับบัญชา (เช่นupstart
, systemd
) จำเป็นที่จะต้องติดตามการบริการเริ่มต้นของพวกเขา บริการจำนวนมากทำให้เสียสละด้วยการฟอร์กซ้ำสองครั้งและรับการอ้างถึง PID อีกครั้งโดยนัย1. ผู้จัดการบริการจะไม่สามารถรับSIGCHLD
สัญญาณสำหรับพวกเขาได้อีกต่อไปและไม่รับผิดชอบในการเลี้ยงเด็กด้วยwait()
อีกต่อไป ข้อมูลทั้งหมดเกี่ยวกับเด็กหายไปในขณะนี้ PID 1 ล้างกระบวนการที่ได้รับการจดสิทธิบัตรใหม่ ขณะนี้กระบวนการตัวจัดการบริการสามารถทำเครื่องหมายตัวเองว่าเป็น "sub-init" และขณะนี้สามารถอยู่ในฐานะผู้ปกครองของกระบวนการ orphaned ทั้งหมดที่สร้างโดยบริการที่เริ่มต้น SIGCHLD
สัญญาณทั้งหมดจะถูกส่งไปยังผู้จัดการบริการ
โดยปกติแล้ว daemon จะถูกสร้างโดยการฟอร์กสองครั้งด้วยกระบวนการระดับกลางที่ออกหลังจากฟอร์กหลาน นี้เป็นเทคนิคทั่วไปเพื่อหลีกเลี่ยงกระบวนการผีดิบ สคริปต์ init เรียกเด็ก ๆ เด็กคนนั้นส้อมอีกครั้งและออกไปทันที หลานจะได้รับการอุปการะinit
ซึ่งเรียกร้องอย่างต่อเนื่องwait()
เพื่อรวบรวมสถานะทางออกของลูก ๆ ของเขาเพื่อหลีกเลี่ยงซอมบี้ กับแนวคิดของ subreapers ผู้จัดการบริการ userspace init
ตอนนี้กลายเป็นผู้ปกครองใหม่แทน