tl; DR:
ทำไมsleep
กระบวนการสามารถอยู่รอดได้เมื่อฉันออกจากระบบและปิดเครื่อง? ในใจของฉันทุกอย่างยกเว้น daemons และnohup
โปรแกรมจะถูกฆ่าระหว่างออกจากระบบ หากsleep
สามารถอยู่รอดด้วยวิธีนี้แสดงว่าฉันสามารถใช้วิธีนี้แทนnohup
คำสั่งได้หรือไม่
ยกเว้นว่าการbash
วางไข่โดยssh
มีhuponexit
ชุดตัวเลือกจะไม่มีกระบวนการใดถูกยกเลิกโดยค่าเฉลี่ยเมื่อออก / ออกจากระบบและเมื่อhuponexit
มีการตั้งค่าตัวเลือกการใช้kill -9
บนเชลล์ไม่ใช่ทางเลือกที่ดีในการใช้nohup
กับกระบวนการลูกของเชลล์ nohup
บนกระบวนการลูกของเชลล์จะยังคงปกป้องพวกเขาจาก SIGHUPs ที่ไม่ได้มาจากเชลล์และแม้ว่าจะไม่ได้รับความสำคัญnohup
ก็ตามก็ยังคงเป็นที่ต้องการเพราะมันช่วยให้เชลล์ถูกยกเลิกอย่างสง่างาม
ในbash
มีตัวเลือกที่เรียกว่าhuponexit
ซึ่งหากตั้งค่าจะทำให้bash
SIGHUP ลูก ๆ ของมันเมื่อออก / ออกจากระบบ;
ในอินสแตนซ์ที่ไม่ใช่การล็อกอินแบบ bash
อินเทอร์แอคทีฟเช่นในbash
อินสแตนซ์ที่เกิดจากgnome-terminal
ตัวเลือกนี้จะถูกละเว้น ไม่ว่าจะhuponexit
มีการตั้งค่าหรือไม่ได้ตั้งค่าbash
ลูก ๆ ของจะไม่ถูก SIGHUPPed โดยbash
เมื่อออกจาก;
ในอินสแตนซ์การเข้าสู่ระบบ แบบอินเทอร์แอคทีฟbash
เช่นในbash
อินสแตนซ์ที่เกิดจากssh
ตัวเลือกนี้จะไม่ถูกละเว้น หากhuponexit
มีการตั้งค่าbash
ลูกของจะถูกยกเลิกโดยbash
เมื่อออก / ออกจากระบบ; หากhuponexit
ไม่ได้ตั้งค่าbash
ลูกของจะไม่ได้รับการชมซ้ำbash
เมื่อออก / ออกจากระบบ
ดังนั้นโดยทั่วไปการออก / ออกจากbash
อินสแตนซ์การเข้าสู่ระบบแบบอินเทอร์แอคทีฟยกเว้นว่าhuponexit
มีการตั้งค่าตัวเลือกจะไม่ทำให้เชลล์ SIGHUP เป็นลูกของมันและออกจาก / ออกจากbash
อินสแตนซ์ที่ไม่ใช่การเข้าสู่ระบบแบบโต้ตอบโดยไม่คำนึงถึง;
อย่างไรก็ตามนี่คือสิ่งที่ไม่เกี่ยวข้องในกรณีนี้: การใช้kill -9
sleep
จะอยู่รอดได้โดยไม่คำนึงถึงเพราะการฆ่ากระบวนการหลัก ( bash
) จะไม่ปล่อยให้โอกาสสำหรับผู้ใช้ทำสิ่งใด ๆกับอดีต (เช่นเช่นถ้าbash
อินสแตนซ์ปัจจุบันเป็นbash
อินสแตนซ์ล็อกอินและhuponexit
ตัวเลือกถูกตั้งค่าเป็น SIGHUP มัน)
การเพิ่มสิ่งนี้ไม่เหมือนกับสัญญาณอื่น ๆ (เช่นสัญญาณ SIGHUP ที่ส่งไปbash
) สัญญาณ SIGKILL จะไม่แพร่กระจายไปยังกระบวนการลูกของกระบวนการดังนั้นจึงsleep
ไม่ได้ถูกฆ่า
nohup
เริ่มกระบวนการภูมิคุ้มกันต่อสัญญาณ SIGHUP ซึ่งเป็นสิ่งที่แตกต่าง มันจะป้องกันไม่ให้กระบวนการค้างอยู่ที่การรับสัญญาณ SIGHUP ซึ่งในกรณีนี้สามารถรับได้โดยbash
อินสแตนซ์การเข้าสู่ระบบแบบโต้ตอบในกรณีที่huponexit
มีการตั้งค่าตัวเลือกและเชลล์ออก; ดังนั้นการใช้เทคนิคnohup
ในการเริ่มต้นกระบวนการในbash
อินสแตนซ์การเข้าสู่ระบบแบบอินเทอร์แอคทีฟด้วยhuponexit
ตัวเลือกที่ไม่มีการตั้งค่าจะป้องกันไม่ให้กระบวนการวางสายเมื่อรับสัญญาณ SIGHUP แต่การออกจากระบบ
อย่างไรก็ตามโดยทั่วไปเมื่อnohup
จำเป็นต้องป้องกันสัญญาณ SIGHUP ที่มาจากเชลล์พาเรนต์ก็ไม่มีเหตุผลใดที่จะkill -9
เลือกใช้เมธอด parent nohup
บนเมธอด child มันควรจะตรงกันข้าม
การฆ่าผู้ปกครองโดยใช้kill -9
วิธีการนั้นไม่ทำให้ผู้ปกครองสามารถออกจากระบบได้อย่างสง่างามในขณะที่การเริ่มต้นเด็กโดยใช้nohup
วิธีการอนุญาตให้ผู้ปกครองถูกยกเลิกโดยสัญญาณอื่น ๆ เช่น SIGHUP (เพื่อเป็นตัวอย่างที่เหมาะสมในบริบท ของเด็กเริ่มใช้nohup
) ซึ่งอนุญาตให้เด็กออกไปอย่างงดงาม
&
จะแยกกระบวนการเป็นพื้นหลัง (เช่น daemon) และทำงานต่อไปแม้ว่าคุณจะออกจากระบบแล้ว