เหตุใดฉันจึงไม่สามารถฆ่ากระบวนการ SIGSTOP ด้วย SIGTERM และสัญญาณที่ค้างอยู่ถูกเก็บไว้ที่ไหน


24

ฉันกำลังใช้ Debian stretch (systemd) ฉันใช้ rsyslog daemon ในโหมดเบื้องหน้าโดยใช้ /usr/sbin/rsyslogd -n และฉันได้Ctrl+ Zเพื่อหยุดมัน สถานะของกระบวนการเปลี่ยนเป็นTl(หยุดทำงาน, เธรด) ฉันออกคำสั่งหลายคำสั่งให้กับกระบวนการและสถานะของกระบวนการเหมือนกัน: . เมื่อฉันทำมันก็ตาย ฉันมี 3 คำถามkill -15 <pid>Tlfg

  • ทำไมเป็นSIGSTOPกระบวนการ -ed ไม่ตอบสนองต่อSIGTERM? ทำไมเคอร์เนลจึงเก็บมันไว้ในสถานะเดียวกัน
  • ทำไมมันถึงถูกฆ่าทันทีที่ได้รับSIGCONTสัญญาณ
  • หากเป็นเพราะSIGTERMสัญญาณก่อนหน้านี้จะถูกเก็บไว้ที่ไหนจนกว่ากระบวนการจะกลับมาทำงานต่อ

คำตอบ:


41

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


1
@nohup คำตอบเพิ่มเติม แต่ที่สำคัญคือ "ใช่มันจัดการสิ่งที่kill -15คุณส่งไปแล้ว"
roaima

2
@nohup ใช่ตามเอกสาร: « ในขณะที่กระบวนการหยุดทำงานจะไม่สามารถส่งสัญญาณได้อีกจนกว่าจะดำเนินการต่อ ... สัญญาณจะถูกทำเครื่องหมายว่าค้างอยู่ แต่ไม่ได้ส่งจนกว่ากระบวนการจะดำเนินการต่อ »
roaima

1
ดู SIGTTIN และ SIGTTOU ที่หยุดกระบวนการต่าง ๆ ด้วย
Stéphane Chazelas

1
@ StéphaneChazelasเป็นจุดที่ดี ฉันได้เพิ่มการกล่าวถึงสิ่งเหล่านี้ แต่ไม่สนใจ โปรดแก้ไขตามที่เห็นสมควร
roaima

2
@coteyr ฉันไม่เห็นด้วย: SIGKILLป้องกันแอปไม่ให้ล้างดังนั้นการใช้SIGTERMจึงเหมาะสมกว่าในหลาย ๆ กรณี (ส่วนใหญ่)
roaima

9

SIGTERMก็เหมือนกับสัญญาณอื่น ๆที่สามารถจับได้โดยกระบวนการ การรับสัญญาณจะทำให้กระบวนการข้ามไปที่รูทีนตัวจัดการสัญญาณพิเศษ สำหรับSIGTERMการดำเนินการเริ่มต้นจะเป็นการยุติกระบวนการ แต่เช่นตัวแก้ไขอาจจับสัญญาณเพื่อให้สามารถบันทึกสำเนาแบบร่างของไฟล์ที่เปิดใด ๆ ก่อนที่จะตาย หากกระบวนการหยุดทำงานจะไม่สามารถเรียกใช้ตัวจัดการสัญญาณได้ แต่สัญญาณจะยังคงค้างอยู่จนกว่ากระบวนการจะดำเนินต่อไป โปรดทราบว่าปกติจำนวนสัญญาณที่ส่งจะไม่ได้รับการบันทึก

ในทางทฤษฎีระบบสามารถทราบได้ว่ากระบวนการนั้นมีตัวจัดการสัญญาณติดตั้งไว้SIGTERMหรือไม่และยุติทันทีหากไม่มี แต่ (ตามความคิดเห็นของกิลส์) POSIX SIGCONTเรียกร้องให้สัญญาณจะแขวนจนกว่ากระบวนการอย่างต่อเนื่องผ่านทาง


4
ขออภัยความคิดเห็นก่อนหน้าของฉันผิด ในขณะที่กระบวนการหยุดทำงานจะไม่มีการส่งสัญญาณใด ๆ ยกเว้น SIGKILL และ SIGCONT แม้ว่าสัญญาณมีการดำเนินการเริ่มต้นซึ่งจะฆ่ากระบวนการนี้จะล่าช้าจนกว่ากระบวนการจะกลับมาทำงานต่อโดย SIGCONT POSIX บังคับพฤติกรรมนี้
Gilles 'หยุดความชั่วร้าย'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.