Python: What is the default handling of SIGTERM? Python: What is the default handling of SIGTERM? python python

Python: What is the default handling of SIGTERM?


Building on the answer of Thomas Wouters, python does not register a handler for the SIGTERM signal. We can see this by doing:

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

That means that the system will take the default action. On linux, the default action (according to the signal man page) for a SIGTERM is to terminate the process.

Terminating a process means that:

  • the process will simply not be allocated any more time slices during which it can execute code.

    • This means that it will not raise an exception, or call the code in try: finally: blocks, or the __exit__ method of context managers. It will not do those things because that particular python interpreter will never get the chance to execute another instruction.
  • The process's memory and other resources (open files, network sockets, etc...) will be released back to the rest of the system.


Nothing. Python itself does not register a signal handler for it. You can check this in the interactive interpreter:

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

That shows signal.signal() returning signal.SIG_DFL for signal.SIGTERM. Contrast it with signal.SIGINT, which does have a default signal handler (which raises KeyboardInterrupt):

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


Look at this example:

import timeclass A:    def __init__(self):        print("A.__init__()")    def __del__(self):        print("A.__del__()")a = A()b = A()time.sleep(10)

Under normal circumstances, the output would be:

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

But if you kill it with SIGTERM you get:

A.__init__()A.__init__()Terminated

Thus the program does not terminate cleanly (the destructors are not called).