42

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

4

3 回答 3

31

基于 Thomas Wouters 的回答,python 没有为 SIGTERM 信号注册处理程序。我们可以通过以下方式看到这一点:

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

这意味着系统将采取默认操作。在 linux 上,SIGTERM 的默认操作(根据信号手册页)是终止进程。

终止进程意味着:

  • 该进程将不再分配任何可以执行代码的时间片。

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

于 2017-01-24T23:25:32.840 回答
23

没有什么。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>
于 2012-03-29T18:00:19.613 回答
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

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

于 2019-10-07T10:35:16.260 回答