如果Python收到一个SIGTERM信号,但没有为其注册信号处理程序,它默认会执行什么操作?
建立在Thomas Wouters的答案之上,Python没有为SIGTERM信号注册处理程序。我们可以通过执行以下操作来看到这一点:
In[23]: signal.SIG_DFL == signal.signal(signal.SIGTERM,signal.SIG_DFL)
Out[23]: True
这意味着系统将采取默认操作。在Linux上,根据信号手册,SIGTERM的默认操作是终止进程。
终止进程意味着:
进程在执行代码时将不再被分配时间片。
__exit__
方法。由于该特定Python解释器永远没有机会执行另一个指令,因此不会执行这些操作。进程的内存和其他资源(打开的文件、网络套接字等)将释放回系统的其他部分。
没有任何内容。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>
SIGTERM
终止,通过 atexit.register()
注册的函数将不会被调用。 - Sven Marnach看看这个例子:
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