Python:SIGTERM的默认处理是什么?

时间:2012-03-29 17:42:41

标签: python signals sigterm

如果Python收到SIGTERM但没有为其注册信号处理程序,默认情况下会做什么?

3 个答案:

答案 0 :(得分:19)

无。 Python本身没有为它注册信号处理程序。您可以在交互式口译员中查看:

>>> import signal
>>> signal.signal(signal.SIGTERM, signal.SIG_DFL)
0
>>> signal.SIG_DFL
0

显示signal.signal()signal.SIGTERM返回signal.SIG_DFL。将其与signal.SIGINT进行对比,KeyboardInterrupt具有默认信号处理程序(引发>>> signal.signal(signal.SIGINT, signal.SIG_DFL) <built-in function default_int_handler> ):

{{1}}

答案 1 :(得分:15)

基于Thomas Wouters的答案,python没有注册SIGTERM信号的处理程序。我们可以这样做:

In[23]: signal.SIG_DFL == signal.signal(signal.SIGTERM,signal.SIG_DFL)
Out[23]: True

这意味着系统将采取默认操作。在linux上,SIGTERM的默认操作(根据the signal man page)是终止进程。

终止进程意味着:

  • 过程将不再被分配任何时间片,在此期间它可以执行代码。

    • 这意味着它不会引发异常,也不会调用try:finally:blocks中的代码或上下文管理器的退出方法。它不会做那些事情,因为特定的python解释器永远不会有机会执行另一条指令。
  • 进程的内存和其他资源(打开的文件,网络套接字等等)将被释放回系统的其余部分。

答案 2 :(得分:-1)

看这个例子:

import time

class A:
    def __init__(self):
        print("A.__init__()")

    def __del__(self):
        print("A.__del__()")

a = A()
b = A()

time.sleep(10)

在正常情况下,输出为:

A.__init__()
A.__init__()
A.__del__()
A.__del__()

但是,如果您用SIGTERM杀死它,则会得到:

A.__init__()
A.__init__()
Terminated

因此,程序无法干净地终止(不调用析构函数)。