Подтвердить что ты не робот

Python: Какова стандартная обработка SIGTERM?

Что делает Python под обложками по умолчанию, если он получает SIGTERM, но для него не зарегистрирован обработчик сигналов?

4b9b3361

Ответ 1

Ничего. Сам 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>

Ответ 2

Основываясь на ответе Томаса Вутерса, python не регистрирует обработчик для сигнала SIGTERM. Мы можем увидеть это, выполнив:

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

Это означает, что система выполнит действие по умолчанию. В Linux действие по умолчанию (в соответствии с страницей справочника сигналов) для SIGTERM заключается в прекращении процесса.

Завершение процесса означает, что:

  • процесс просто больше не будет выделяться временными интервалами, в течение которых он может выполнять код.

    • Это означает, что он не будет вызывать исключение или вызывать код в try: finally: blocks или методе __exit__ контекстных менеджеров. Он не будет делать эти вещи, потому что этот конкретный интерпретатор Python никогда не получит шанс выполнить другую инструкцию.
  • Память процесса и другие ресурсы (открытые файлы, сетевые сокеты и т.д.) Будут возвращены в остальную часть системы.

Ответ 3

Посмотрите на этот пример:

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

Таким образом, программа не завершает свою работу чисто (деструкторы не вызываются).