Что делает Python под обложками по умолчанию, если он получает SIGTERM, но для него не зарегистрирован обработчик сигналов?
Python: Какова стандартная обработка SIGTERM?
Ответ 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 никогда не получит шанс выполнить другую инструкцию.
- Это означает, что он не будет вызывать исключение или вызывать код в try: finally: blocks или методе
Память процесса и другие ресурсы (открытые файлы, сетевые сокеты и т.д.) Будут возвращены в остальную часть системы.
Ответ 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
Таким образом, программа не завершает свою работу чисто (деструкторы не вызываются).