มีหลายกรณีที่ความแตกต่างเล็กน้อยระหว่างสภาพแวดล้อมสามารถกัดคุณได้ นี่คือสิ่งที่ฉันได้วิ่งไปเมื่อเร็ว ๆ นี้ ความแตกต่างระหว่างสองคำสั่งเหล่านี้คืออะไร?
1 ~ $ nohup myprocess.out &
2 ~ $ myprocess.out &
คำตอบเหมือนกันตามปกติ - ขึ้นอยู่กับ
nohup จับสัญญาณ hangup ขณะที่เครื่องหมายและไม่ทำ
สัญญาณ Hangup คืออะไร?
SIGHUP - ตรวจพบ Hangup ในเทอร์มินัลการควบคุมหรือการตายของกระบวนการควบคุม (ค่า: 1)
โดยปกติเมื่อรันคำสั่งโดยใช้ & และออกจากเชลล์หลังจากนั้นเชลล์จะยุติคำสั่งย่อยด้วยสัญญาณ Hangup (เช่น kill -SIGHUP $ PID) สิ่งนี้สามารถป้องกันได้โดยใช้ nohup เนื่องจากมันจับสัญญาณและละเว้นมันเพื่อไม่ให้เข้าถึงแอปพลิเคชันจริง
สบายดี แต่ในกรณีนี้มี 'buts' อยู่เสมอ ไม่มีความแตกต่างระหว่างวิธีการเรียกใช้เหล่านี้เมื่อเชลล์ถูกกำหนดค่าในลักษณะที่ไม่ส่ง SIGHUP เลย
ในกรณีที่คุณใช้ bash คุณสามารถใช้คำสั่งที่ระบุด้านล่างเพื่อค้นหาว่าเชลล์ของคุณส่ง SIGHUP ไปยังกระบวนการลูกหรือไม่:
~ $ shopt | grep hupon
และยิ่งกว่านั้น - มีหลายกรณีที่ nohup ไม่ทำงาน ตัวอย่างเช่นเมื่อกระบวนการที่คุณเริ่มเชื่อมต่อสัญญาณ NOHUP อีกครั้ง (เสร็จสิ้นภายในระดับรหัสแอปพลิเคชัน)
ในกรณีที่อธิบายไว้การขาดความแตกต่างทำให้ฉันเล็กน้อยเมื่ออยู่ในสคริปต์เรียกใช้บริการที่กำหนดเองมีการเรียกใช้สคริปต์ที่สองซึ่งตั้งค่าและเรียกใช้แอปพลิเคชันที่เหมาะสมโดยไม่มีคำสั่ง nohup
ในสภาพแวดล้อม Linux หนึ่งทุกอย่างทำงานได้อย่างราบรื่นในแอปพลิเคชั่นที่สองออกจากทันทีที่สคริปต์ที่สองออกมา (การตรวจสอบกรณีนั้นแน่นอนว่าใช้เวลากับฉันมากกว่านี้แล้วคุณอาจคิดว่า:
หลังจากเพิ่ม nohup เป็นวิธีการเรียกใช้กับสคริปต์ที่สองแอปพลิเคชันจะยังคงทำงานต่อไปแม้ว่าสคริปต์จะออกและพฤติกรรมนี้ก็สอดคล้องกันในทั้งสองสภาพแวดล้อม