ในกรณีใดที่ SIGHUP ไม่ส่งงานเมื่อคุณออกจากระบบ?


10

ฉันอ่านคำตอบจากผู้ใช้ที่อ้างว่าใช้งานได้

foo 2>&1 >& output.log &

จะส่งผลfooให้ทำงานต่อไปแม้ในขณะที่ออกจากระบบ ตามที่ผู้ใช้คนนี้ทำงานได้ดีกว่าการเชื่อมต่อ SSH

ฉันไม่เชื่อจริง ๆ เพราะฉันรู้สึกว่าในกรณีที่ตัดการเชื่อมต่อจาก SSH หรือยกเลิก TTY เชลล์และกระบวนการของมันจะได้รับ SIGHUP ทำให้พวกเขายุติ นี้ภายใต้สมมติฐานของฉันเป็นเหตุผล แต่เพียงผู้เดียวสำหรับการใช้nohupในกรณีดังกล่าวหรือtmux, screenet al,

ฉันดูคู่มือของ glibc แล้ว :

สัญญาณนี้ยังใช้เพื่อรายงานการยุติกระบวนการควบคุมในเทอร์มินัลไปยังงานที่เกี่ยวข้องกับเซสชันนั้น การยุตินี้จะยกเลิกการเชื่อมต่อกระบวนการทั้งหมดในเซสชันจากเทอร์มินัลการควบคุมอย่างมีประสิทธิภาพ

ดูเหมือนว่าจะยืนยันความคิดของฉัน แต่เมื่อมองไปไกลมันก็บอกว่า :

หากกระบวนการเป็นผู้นำเซสชันที่มีเทอร์มินัลการควบคุมสัญญาณ SIGHUP จะถูกส่งไปยังแต่ละกระบวนการในงานเบื้องหน้าและเทอร์มินัลการควบคุมจะถูกยกเลิกการเชื่อมโยงจากเซสชันนั้น

ดังนั้นนี่หมายความว่างานที่อยู่ในพื้นหลังจะไม่ได้รับ SIGHUP หรือไม่?

สำหรับความสับสนที่เพิ่มขึ้นของฉันฉันใช้เซสชัน Zsh แบบอินเทอร์แอคทีฟวิ่งyes >& /dev/null &และพิมพ์exitเมื่อ Zsh เตือนฉันว่าฉันทำงานอยู่และหลังจากพิมพ์exitครั้งที่สองบอกฉันว่ามีงานหนึ่งงาน การทำเช่นเดียวกันนี้ใน Bash ทำให้งานหยุดทำงาน ...


ฉันเคยมีปัญหากับเซิร์ฟเวอร์ในอดีตที่ถูกตัดการเชื่อมต่อผ่าน ssh และกระบวนการของฉันเพิ่งจะเริ่มทำงาน แต่ไม่มีการเชื่อมโยง tty ใด ๆ ดังนั้นฉันจึงต้องลงชื่อเข้าใช้อีกครั้งและส่ง SIGHUP / TERM / KILL เพื่อสิ้นสุด ดังนั้นตามตรรกะเดียวกันฉันได้ทดสอบตอนนี้พิมพ์logoutและyesยังคงทำงานอยู่
Braiam

นอกเหนือจากการส่ง SIGHUP หรือไม่กระบวนการจะกำหนดตัวจัดการสัญญาณ (และจับ SIGHUP) หรือรูปแบบสัญญาณเป็นปัจจัยเพิ่มเติมในการยกเลิกหรือไม่เมื่อส่งสัญญาณนั้น ดังนั้นเพียงเพราะมันยังคงทำงานหลังจากออกจากระบบไม่ได้หมายความว่ามันไม่ได้ส่งสัญญาณนั้น
ทิม B

คุณอ้างถึงคำถามนี้: serverfault.com/questions/115999/หรือไม่? ดูเหมือนว่าคำตอบจะพบได้ที่นั่น - มัน RedHat ไม่ได้ตั้งค่า shopt โดยค่าเริ่มต้น มันเป็นมุมมองที่แปลกประหลาดของ RedHat
Boris Burkov

@ บ๊อบไม่ฉันไม่เคยเห็นแบบนี้มาก่อน แต่มันเป็นทรัพยากรที่ดี ขอบคุณ!
slhck

ดีใจที่มันช่วย จริงๆแล้วราฟาเอลก็อ้างถึงประเด็นนั้นเช่นกัน
Boris Burkov

คำตอบ:


18

ดูเหมือนว่าทุบตีจะส่งSIGHUPเฉพาะในกรณีที่มันได้รับด้วยตนเองSIGHUPซึ่งตัวอย่างเช่นเกิดขึ้นเมื่อปิดสถานีเสมือนหรือเมื่อการเชื่อมต่อ SSH ถูกขัดจังหวะ จากเอกสารประกอบ :

เชลล์ออกโดยค่าเริ่มต้นเมื่อได้รับ SIGHUP ก่อนที่จะออกจากเชลล์เชิงโต้ตอบจะส่ง SIGHUP ไปยังงานทั้งหมดอีกครั้งทำงานหรือหยุด งานที่หยุดจะถูกส่ง SIGCONT เพื่อให้แน่ใจว่าพวกเขาได้รับ SIGHUP เพื่อป้องกันไม่ให้เชลล์ส่งสัญญาณ SIGHUP ไปยังงานเฉพาะควรลบออกจากตารางงานด้วย built-in ที่สร้างขึ้น (ดูที่ตัวควบคุมงานในตัว) หรือทำเครื่องหมายว่าไม่รับ SIGHUP โดยใช้ disown -h

ดังนั้นหากคุณพิมพ์exitหรือกดCtrl+ Dกระบวนการพื้นหลังทั้งหมดจะยังคงอยู่เนื่องจากจะไม่ส่งสัญญาณวางสายไปที่ Bash

คุณสามารถบังคับให้ Bash เตือนคุณเกี่ยวกับความจริงที่ว่ายังมีกระบวนการที่ทำงานอยู่เบื้องหลัง

shopt -s checkjobs

มีตัวเลือกในการส่งSIGHUPออกเมื่อคุณอยู่ในเปลือกโต้ตอบ ( ดูที่นี่ ) แต่มันใช้ไม่ได้กับเครื่องของฉันด้วย Bash 4.2.25 อาจจะเหมาะกับคุณ

shopt -s huponexit

ดังนั้นเมื่อการเชื่อมต่อ SSH ขัดจังหวะSIGHUPจะถูกส่งมิฉะนั้นด้วยการออกใหม่ทั้งหมดงานยังคงทำงานอยู่? นั่นอธิบายสิ่งที่ฉันเห็น
slhck

ใช่. สัญญาณวางสายมีไว้สำหรับกรณีพิเศษเท่านั้นเมื่อการเชื่อมต่อกับผู้ใช้ถูกขัดจังหวะ
Raphael Ahrens

ขอให้เรายังคงอภิปรายนี้ในการแชท
Martin Kunev


@npostavs ขอบคุณสำหรับข้อมูลที่ฉันเพิ่มเข้าไปในคำตอบ
Raphael Ahrens
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.