Python:SIGTERM的默认处理是什么



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

基于Thomas Wouters的回答,python没有为SIGTERM信号注册处理程序。 我们可以通过执行以下操作来查看这一点:

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

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

终止进程意味着:

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

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

什么都没有。Python 本身不会为其注册信号处理程序。您可以在交互式解释器中检查这一点:

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

这显示了signal.signal()返回信号。SIG_DFL signal.SIGTERM.将其与 signal.SIGINT 进行对比,后者确实有一个默认的信号处理程序(会引发KeyboardInterrupt(:

>>> signal.signal(signal.SIGINT, signal.SIG_DFL)
<built-in function default_int_handler>

看看这个例子:

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

因此,程序不会完全终止(不调用析构函数(。

相关内容

  • 没有找到相关文章