如果Python收到SIGTERM但没有为其注册信号处理程序,默认情况下会做什么?
答案 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)是终止进程。
终止进程意味着:
过程将不再被分配任何时间片,在此期间它可以执行代码。
进程的内存和其他资源(打开的文件,网络套接字等等)将被释放回系统的其余部分。
答案 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
因此,程序无法干净地终止(不调用析构函数)。