เหตุใด CPython interpreter จึงไม่สนใจ TERM เมื่อทำงานในคอนเทนเนอร์


1

ถ้าฉันเริ่มต้นกระบวนการ Python ในคอนเทนเนอร์ด้วย

docker run --name python python python3 -c "import time; time.sleep(3600)"

และพยายามที่จะยกเลิกสิ่งนี้ในคอนโซลอื่นด้วย

docker stop python

ล่ามไม่หยุด นักเทียบท่าต้องฆ่ากระบวนการหลังจากช่วงเวลาผ่อนผัน (10 วินาทีโดยค่าเริ่มต้น)

อย่างไรก็ตามแบบง่าย

python3 -c "import time; time.sleep(3600)"

บนบรรทัดคำสั่งสามารถยกเลิกได้ทันทีโดยส่ง TERM ไปที่มัน

อะไรคือสาเหตุของความไม่สมดุลนี้


ฉันไม่รู้จักนักเทียบท่า แต่ฉันสงสัยว่าstopคำสั่งของมันจะส่งสัญญาณที่แตกต่างTERMไปจากคอนเทนเนอร์ แก้ไข: คุณได้ลองdocker kill python? (หรืออีกวิธีหนึ่งที่จะส่ง SIGTERM: docker kill --signal=SIGTERM python)
Confetti

ดูdocs.docker.com/engine/reference/commandline/stop :“ กระบวนการหลักภายในคอนเทนเนอร์จะได้รับ SIGTERM และหลังจากช่วงเวลาผ่อนผัน SIGKILL”
Torsten Bronger

คำตอบ:


0

ความไม่สมดุลเกิดขึ้นจาก UNIX เอง man 2 killmanpage ของ Linux บอกว่า:

สัญญาณเดียวที่สามารถส่งไปยังกระบวนการ ID 1 ซึ่งเป็นกระบวนการเริ่มต้นคือสัญญาณที่ init ได้ติดตั้งตัวจัดการสัญญาณอย่างชัดเจน สิ่งนี้ทำเพื่อให้มั่นใจว่าระบบจะไม่ถูกลบโดยไม่ตั้งใจ

Python โดยค่าเริ่มต้นจะไม่มีตัวจัดการ หาก Python interpreter ทำงานไม่เป็น PID 1 นี่หมายความว่ามีการดำเนินการเริ่มต้นซึ่งสำหรับ SIGTERM หมายถึงยกเลิกกระบวนการ หากทำงานเป็น PID 1 จะไม่มีการดำเนินการเริ่มต้น ดังนั้นไม่มีอะไรเกิดขึ้น

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