Python: Что такое стандартная обработка SIGTERM? - PullRequest
26 голосов
/ 29 марта 2012

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

Ответы [ 2 ]

19 голосов
/ 29 марта 2012

Ничего.Сам 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>
15 голосов
/ 25 января 2017

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

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

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

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

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

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

...