如果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的默认退出码?
- 2. 默认错误处理程序的定义是什么?
- 3. wxPython处理SIGTERM/SIGINT
- 4. 如何处理SIGTERM
- 5. 什么是默认注释处理器发现过程?
- 6. 什么是默认的TransformerFactory?
- 7. 什么是默认的MaxPoolSize?
- 8. Java:如何仅处理SIGTERM?
- 9. 什么是PHImageRequestOptionsResizeMode默认值?
- 10. UnityContainer:什么是默认lifetimemanager
- 11. 什么是默认goroutine?
- 12. 为什么Mockito不能正确处理默认的Scala参数?
- 13. 什么是“self.default =默认,如果默认其他类型()”是什么意思?
- 14. 什么是处理
- 15. Jersey的默认异常处理是什么? (如果没有提供ExceptionMapper)
- 16. 你如何确定默认的外发邮件处理程序是什么?
- 17. 处理函数django模型字段默认值的最佳方法是什么?
- 18. 为什么Androids处理事件的默认方式是重新创建活动?
- 19. 为什么ASP.Net处理程序默认支持会话
- 20. Tomcat默认会话处理
- 21. 默认异常处理
- 22. Perl的相当于Python的dict.get(键,默认)是什么?
- 23. Akamai的HTTP代理的默认URL参数是什么?
- 24. 什么是NSNumberFormatter默认的RoundingMode
- 25. Django字段的默认值是什么?
- 26. 什么是tomcat默认的GC选项?
- 27. 什么是'success_url'变量的默认值
- 28. 什么是`object`的默认`apply`方法?
- 29. servlet的默认超时是什么?
- 30. UITableViewCellAccessoryCheckmark的默认颜色是什么?
这也意味着如果进程被SIGTERM终止,那么通过'atexit.register()'注册的函数将不会被调用。 – 2012-03-29 18:16:55
好吧,但它做什么?不干净地退出?完全忽略它?还有别的吗? – Lucretiel 2016-05-06 21:09:37