Что делает Python под покровом по умолчанию, если он получает SIGTERM, но для него не зарегистрирован обработчик сигналов?Python: Какова стандартная обработка SIGTERM?
ответ
Ничего. Сам Python не регистрирует обработчик сигналов. Вы можете проверить это в интерактивном переводчику:
>>> import signal
>>> signal.signal(signal.SIGTERM, signal.SIG_DFL)
0
>>> signal.SIG_DFL
0
Это показывает signal.signal()
возвращение signal.SIG_DFL для signal.SIGTERM
. Контраст это с signal.SIGINT
, который имеет обработчик сигнал по умолчанию (который поднимает KeyboardInterrupt
):
>>> signal.signal(signal.SIGINT, signal.SIG_DFL)
<built-in function default_int_handler>
Опираясь на ответ Томаса Уотерса, питон не регистрирует обработчик для сигнала SIGTERM. Мы это видим, например:
In[23]: signal.SIG_DFL == signal.signal(signal.SIGTERM,signal.SIG_DFL)
Out[23]: True
Это означает, что система примет действие по умолчанию. В linux действие по умолчанию (согласно the signal man page) для SIGTERM - это прекращение процесса.
Завершение процесса означает, что:
процесс просто не будет выделено больше времени ломтиков, в течение которого он может выполнять код.
- Это означает, что он не будет вызывать исключение, или вызвать код в попытке: наконец: блоков, или выхода метода менеджеров контекста. Он не будет делать эти вещи, потому что этот конкретный интерпретатор python никогда не получит возможность выполнить другую инструкцию.
Память процесса и другие ресурсы (открытые файлы, сетевые сокеты и т. Д.) Будут выпущены обратно в остальную часть системы.
Это так верно, важно и, по крайней мере, для меня - неинтуитивное. Я думал, что все дело окончательных предложений и методов __ exit__ контекстных менеджеров состояло в том, чтобы убедиться, что этот код всегда запускается (кроме SIGKILL, о котором я знал, обрабатывается на системном уровне). Борясь с этим несколько дней, и только теперь пришел к осознанию того, что вы уже представили здесь в своем ответе. Мне нужно помнить об этом. – matlehmann
Это также означает, что функции, зарегистрированные через 'atexit.register()', не будут вызываться, если процесс завершается 'SIGTERM'. –
Хорошо, но что он делает? Выйти нечисто? Игнорировать его полностью? Что-то другое? – Lucretiel