SIGSTOPและSIGKILLเป็นสัญญาณสองสัญญาณที่ไม่สามารถจับและจัดการโดยกระบวนการ SIGTSTPเป็นเช่นSIGSTOPนั้นยกเว้นว่าสามารถถูกจับและจัดการได้
SIGSTOPและสัญญาณหยุดกระบวนการในเพลงของพร้อมสำหรับSIGTSTP SIGCONTเมื่อคุณส่งกระบวนการSIGTERMนั้นกกระบวนการจะไม่ทำงานดังนั้นจึงไม่สามารถเรียกใช้รหัสเพื่อออกได้
(นอกจากนี้ยังมีSIGTTINและSIGTTOUซึ่งเป็นสัญญาณที่สร้างขึ้นโดยเลเยอร์ TTY เมื่องานที่มีพื้นหลังพยายามอ่านหรือเขียนไปยังเทอร์มินัลพวกเขาสามารถถูกจับได้ แต่จะหยุด (หยุดชั่วคราว) กระบวนการเหมือนSIGTSTPกัน แต่ตอนนี้ฉันจะไป เพื่อเพิกเฉยสองสิ่งนี้สำหรับคำตอบที่เหลือ)
คุณCtrlZส่งเป็นกระบวนการSIGTSTPซึ่งดูเหมือนจะไม่ได้รับการจัดการพิเศษในทางใดทางหนึ่งโดยrsyslogdดังนั้นมันก็ระงับกระบวนการที่ค้างอยู่หรือSIGCONTSIGKILL
วิธีการแก้ปัญหาที่นี่คือการส่งSIGCONTหลังจากของคุณSIGTERMเพื่อให้กระบวนการสามารถรับและจัดการสัญญาณ
ตัวอย่าง:
sleep 999 &
# Assume we got PID 456 for this process
kill -TSTP 456 # Suspend the process (nicely)
kill -TERM 456 # Terminate the process (nicely). Nothing happens
kill -CONT 456 # Continue the process so it can exit cleanly
เอกสารสำหรับGNU C Libraryอธิบายได้ค่อนข้างดีฉันคิดว่า (การเน้นของฉัน):
ในขณะที่กระบวนการที่จะหยุดการทำงานไม่มีสัญญาณอื่น ๆ สามารถส่งมอบให้กับมันจนกว่าจะมีอย่างต่อเนื่องยกเว้นSIGKILLสัญญาณและ (ชัด) SIGCONTสัญญาณ สัญญาณจะถูกทำเครื่องหมายว่าค้างอยู่ แต่จะไม่ส่งจนกว่ากระบวนการจะดำเนินการต่อ สัญญาณมักจะทำให้เกิดการเลิกจ้างของกระบวนการและไม่สามารถปิดกั้นจัดการหรือละเว้น คุณสามารถเพิกเฉยได้ แต่จะทำให้กระบวนการดำเนินต่อไปได้เสมอหากหยุด การส่งสัญญาณไปยังกระบวนการทำให้สัญญาณหยุดใด ๆ ที่รอดำเนินการสำหรับกระบวนการนั้นถูกยกเลิก เช่นเดียวกันสัญญาณใด ๆ ที่ค้างอยู่สำหรับกระบวนการจะถูกยกเลิกเมื่อได้รับสัญญาณหยุดSIGKILLSIGCONTSIGCONTSIGCONT
kill -15คุณส่งไปแล้ว"