ฉันมีกระบวนการดังต่อไปนี้
ParentProcess - กระบวนการเด็ก - กระบวนการเด็ก - กระบวนการเด็ก
ฉันจะฆ่ากระบวนการหลักเท่านั้นได้อย่างไร ฉันไม่ต้องการให้กระบวนการของเด็กถูกฆ่า หากฉันพยายามฆ่ากระบวนการผู้ปกครองเด็ก ๆ จะได้รับ SIGHUP และจะถูกฆ่า
ฉันมีกระบวนการดังต่อไปนี้
ParentProcess - กระบวนการเด็ก - กระบวนการเด็ก - กระบวนการเด็ก
ฉันจะฆ่ากระบวนการหลักเท่านั้นได้อย่างไร ฉันไม่ต้องการให้กระบวนการของเด็กถูกฆ่า หากฉันพยายามฆ่ากระบวนการผู้ปกครองเด็ก ๆ จะได้รับ SIGHUP และจะถูกฆ่า
คำตอบ:
โดยทั่วไปเมื่อกระบวนการกลายเป็นเด็กกำพร้า (นั่นคือพ่อแม่ของมันตาย) มันถูกนำมาใช้โดย init
สถานการณ์พิเศษที่คุณอธิบายอาจนำไปใช้กับกระบวนการโต้ตอบเมื่อเทอร์มินัลการควบคุมของมันปิดลง (จากWikipedia ):
สัญญาณ SIGHUP ถูกส่งไปยังกระบวนการเมื่อปิดเทอร์มินัลการควบคุม มันถูกออกแบบมาเพื่อแจ้งให้ทราบถึงกระบวนการของการปล่อยสายอนุกรม ในระบบที่ทันสมัยสัญญาณนี้มักจะหมายความว่าการควบคุมหลอกหรือ terminal เสมือนถูกปิด
เพื่อป้องกันสิ่งนี้กระบวนการลูกควรบล็อก SIGHUP ดังนั้นโดยส่วนใหญ่คุณต้องได้รับความร่วมมือจากกระบวนการหลัก
หากการปกครองเป็นเปลือก ( bash
, csh
และชอบ) และคุณต้องการคำสั่งที่คุณเรียกไม่ได้ที่จะยุติเมื่อเสร็จสิ้นการทุบตีคุณสามารถคำนำหน้าคำสั่งใด ๆ กับnohup
(จากinfo coreutils "nohup invocation"
):
'nohup' เรียกใช้คำสั่งที่กำหนดพร้อมกับสัญญาณ Hangup ที่ถูกละเว้นเพื่อให้คำสั่งสามารถทำงานต่อในพื้นหลังหลังจากที่คุณออกจากระบบ
ในตัวอย่างนี้:
$ tty
/dev/ttys000
$ nohup find /dir -name file -exec rm {} \;
find
/dev/ttys000
จะไม่ถูกฆ่าตายเมื่อสิ้นสุดเปลือกและปิดสถานีควบคุม
ถ้าสคริปต์เปลือกควรปิดกั้น SIGHUP ใช้ builtin trap
ตามที่อธิบายไว้ที่นี่bash
สำหรับ