tl; DR:
ทำไมsleepกระบวนการสามารถอยู่รอดได้เมื่อฉันออกจากระบบและปิดเครื่อง? ในใจของฉันทุกอย่างยกเว้น daemons และnohupโปรแกรมจะถูกฆ่าระหว่างออกจากระบบ หากsleepสามารถอยู่รอดด้วยวิธีนี้แสดงว่าฉันสามารถใช้วิธีนี้แทนnohupคำสั่งได้หรือไม่
ยกเว้นว่าการbashวางไข่โดยsshมีhuponexitชุดตัวเลือกจะไม่มีกระบวนการใดถูกยกเลิกโดยค่าเฉลี่ยเมื่อออก / ออกจากระบบและเมื่อhuponexitมีการตั้งค่าตัวเลือกการใช้kill -9บนเชลล์ไม่ใช่ทางเลือกที่ดีในการใช้nohupกับกระบวนการลูกของเชลล์ nohupบนกระบวนการลูกของเชลล์จะยังคงปกป้องพวกเขาจาก SIGHUPs ที่ไม่ได้มาจากเชลล์และแม้ว่าจะไม่ได้รับความสำคัญnohupก็ตามก็ยังคงเป็นที่ต้องการเพราะมันช่วยให้เชลล์ถูกยกเลิกอย่างสง่างาม
ในbashมีตัวเลือกที่เรียกว่าhuponexitซึ่งหากตั้งค่าจะทำให้bashSIGHUP ลูก ๆ ของมันเมื่อออก / ออกจากระบบ;
ในอินสแตนซ์ที่ไม่ใช่การล็อกอินแบบ 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) และทำงานต่อไปแม้ว่าคุณจะออกจากระบบแล้ว