เหตุใดกระบวนการพื้นหลังของ nohup จึงถูกฆ่า?


10

ฉันพยายามเริ่มเชลล์สคริปต์ผ่านเซสชันระยะไกลซึ่งเริ่มกระบวนการในพื้นหลังโดยใช้คำสั่ง

nohup python3 run.py > nohup.out &

เมื่อปิดเซสชันระยะไกลกระบวนการกำลังถูกฆ่าด้วยข้อความ:

จับสัญญาณ SIGHUP

พบ SIGHUP แล้ว แต่ไม่ได้รับการทำผิด ออกจาก

ฉันไม่เข้าใจ ทำไมกระบวนการการฆ่าเมื่อมันถูกเริ่มต้นในพื้นหลังโดยใช้nohup & ?


1
ฉันเคยสับสนกับพฤติกรรมที่ไม่คาดคิดทั้งหมดของการควบคุมงานเชลล์ ตอนนี้ฉันแค่ใช้tmuxและเพิกเฉยnohupหรือปฏิเสธหรือทำภารกิจพื้นหลังอย่างสมบูรณ์
Siyuan Ren

คำตอบ:


10

nohupเลิกทำการโปรแกรมหลามของคุณ

nohupละเว้นสัญญาณ Hangup ด้วยSIG_IGNและจากนั้นเชนโหลดโปรแกรมของคุณในกระบวนการเดียวกัน

โปรแกรม Python ของคุณรีเซ็ตการจัดการสัญญาณสำหรับสัญญาณ Hangup ทันทีโดยติดตั้งตัวจัดการสัญญาณของตัวเอง ตัวจัดการนั้นตรวจสอบฟังก์ชันภายใน (ที่ไม่ได้รับการออกแบบที่ดีมากขึ้นอยู่กับสมมติฐานที่มีข้อบกพร่องบางอย่างถ้ามันเป็นสิ่งที่ฉันได้เห็น) และตัดสินใจว่าแนวทางการดำเนินการที่เหมาะสมในการรับสัญญาณ hangup คือการพิมพ์ข้อความนั้น และออกจาก

โปรแกรมหลามของคุณโดยการออกแบบไม่nohupน่า บนระบบที่มี job control shell และ POSIX session / job semantics คุณจะต้องทำการdisownไอเอ็นจีงานเพื่อที่ shell จะไม่เคยรู้เกี่ยวกับมันเพื่อส่งสัญญาณ hangup ไปยังตำแหน่งแรก

(แม้จะไม่เพียงพอในระบบปฏิบัติการ systemd เนื่องจาก systemd คนทำบิตของหูของกลไกเซสชั่นการเข้าสู่พื้นที่ผู้ใช้พื้นที่ของพวกเขาคุณยังต้องให้แน่ใจว่ากลไกของ systemd ที่ส่งสัญญาณการปิดระบบแทนที่จะวางสาย เซสชันการเข้าสู่ระบบที่ออกจากระบบทุกครั้งจะไม่เริ่มขึ้น)

อ่านเพิ่มเติม


3
มันเป็นโปรแกรม Python ของพวกมันหรือไม่หรือเป็น Python interpreter (/ สภาพแวดล้อมแบบรันไทม์) ที่มันอยู่ข้างหลังของมันอย่างเงียบ ๆ ?
ilkkachu

นอกจากนี้บน Mac OS, เข้าออกจากครั้ง ssh ฆ่าคุณเปลือกงานแม้เมื่อเริ่มใช้nohup; ยังไม่พบวิธีแก้ปัญหาสำหรับมัน
imhotap

ถ้าปัญหาคือตัวจัดการสัญญาณ OP ก็สามารถเปลี่ยนตัวจัดการสัญญาณเป็นตัวจัดการที่ไม่ได้ฆ่ากระบวนการ สิ่งนี้ควรทำงานโดยอิสระจากผู้ที่ติดตั้งตัวจัดการสัญญาณดังกล่าว ฉันต้องการเพิ่มเกี่ยวกับ ssh: บางครั้งแม้ว่ากระบวนการยังมีชีวิตอยู่ แต่ก็อาจมีปัญหา สองสามปีที่ผ่านมาฉันเสียเวลาพยายามเข้าใจข้อผิดพลาดเกี่ยวกับการอนุญาตและในที่สุดผู้ร้ายคือ Kerberos: เมื่อเซสชัน ssh ถูกปิดโทเค็นหมดอายุดังนั้นฉันจึงต้องสร้างโทเค็นใหม่เพื่อใช้แทนสิ่งเหล่านั้น ของเซสชัน ssh
Bakuriu

@JdeBP ฉันพยายามsetsid nohup python3 run.py > nohup.out &, setsidได้แก้ไขปัญหานี้ นี่เป็นวิธีการที่เหมาะสมหรือไม่
ที่สุดมณี
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.