如果Python收到一個SIGTERM,但是沒有爲它註冊信號處理程序,Python在默認情況下會做什麼?Python:什麼是SIGTERM的默認處理?
15
A
回答
13
沒什麼。 Python本身並沒有爲它註冊信號處理程序。您可以在交互式解釋檢查:
>>> import signal
>>> signal.signal(signal.SIGTERM, signal.SIG_DFL)
0
>>> signal.SIG_DFL
0
這表明signal.signal()
返回signal.SIG_DFL爲signal.SIGTERM
。與signal.SIGINT
對比吧,這確實有一個缺省的信號處理器(這引起了KeyboardInterrupt
):
>>> signal.signal(signal.SIGINT, signal.SIG_DFL)
<built-in function default_int_handler>
5
大廈托馬斯武泰的答案,Python不註冊SIGTERM信號的處理程序。我們可以這樣做:
In[23]: signal.SIG_DFL == signal.signal(signal.SIGTERM,signal.SIG_DFL)
Out[23]: True
這意味着系統將採取默認操作。在linux上,SIGTERM的默認操作(根據the signal man page)是終止進程。
終止進程意味着:
過程將簡單地不被分配在此期間,它可以執行代碼的任何更多的時間片。
- 這意味着它不會引發異常,或調用代碼嘗試:最後:塊,或上下文管理的出口方法。它不會做那些事情,因爲那個特殊的Python解釋器永遠不會有機會執行另一條指令。
進程的內存和其他資源(打開的文件,網絡套接字等等)將被釋放回系統的其餘部分。
+0
這是真實的,重要的,至少對我來說是不直觀的。我認爲context-managers的finally子句和\ exit_方法的整個業務是確保所運行的代碼始終運行(除了我知道的SIGKILL在系統級別上處理)。用這個掙扎了好幾天,直到現在才意識到你已經在你的答案中提出了這個問題。我需要牢記這一點。 – matlehmann 2017-03-24 11:12:57
相關問題
- 1. Python:覆蓋默認的SIGTERM處理程序
- 2. 什麼是Python的默認退出碼?
- 3. 默認錯誤處理程序的定義是什麼?
- 4. wxPython處理SIGTERM/SIGINT
- 5. 如何處理SIGTERM
- 6. Python的默認字符編碼處理
- 7. 什麼是Spring批處理「默認」上下文變量?
- 8. 什麼是默認註釋處理器發現過程?
- 9. 默認滾動條處理程序是什麼元素?
- 10. 什麼是默認的MaxPoolSize?
- 11. 什麼是默認的TransformerFactory?
- 12. Java:如何僅處理SIGTERM?
- 13. 在OSx中處理sigterm
- 14. 爲什麼不是默認
- 15. UnityContainer:什麼是默認lifetimemanager
- 16. 什麼是Page.ResponseEncoding默認值?
- 17. 什麼是GOMAXPROCS默認值
- 18. 什麼是AdMob默認ID?
- 19. 什麼是ContinueWith默認值
- 20. 什麼是PHImageRequestOptionsResizeMode默認值?
- 21. WebRequest.Proxy - 什麼是默認值
- 22. 什麼是默認goroutine?
- 23. 爲什麼Mockito不能正確處理默認的Scala參數?
- 24. 什麼是處理
- 25. 什麼是「self.default =默認,如果默認其他類型()」是什麼意思?
- 26. 你如何確定默認的外發郵件處理程序是什麼?
- 27. 處理函數django模型字段默認值的最佳方法是什麼?
- 28. 爲什麼Androids處理事件的默認方式是重新創建活動?
- 29. 在瀏覽器崩潰時處理會話的默認方式是什麼
- 30. Jersey的默認異常處理是什麼? (如果沒有提供ExceptionMapper)
這也意味着如果進程被SIGTERM終止,那麼通過'atexit.register()'註冊的函數將不會被調用。 – 2012-03-29 18:16:55
好吧,但它做什麼?不乾淨地退出?完全忽略它?還有別的嗎? – Lucretiel 2016-05-06 21:09:37