2012-03-29 3 views

ответ

13

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

Это также означает, что функции, зарегистрированные через 'atexit.register()', не будут вызываться, если процесс завершается 'SIGTERM'. –

+5

Хорошо, но что он делает? Выйти нечисто? Игнорировать его полностью? Что-то другое? – Lucretiel

5

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

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

Это означает, что система примет действие по умолчанию. В linux действие по умолчанию (согласно the signal man page) для SIGTERM - это прекращение процесса.

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

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

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

+0

Это так верно, важно и, по крайней мере, для меня - неинтуитивное. Я думал, что все дело окончательных предложений и методов __ exit__ контекстных менеджеров состояло в том, чтобы убедиться, что этот код всегда запускается (кроме SIGKILL, о котором я знал, обрабатывается на системном уровне). Борясь с этим несколько дней, и только теперь пришел к осознанию того, что вы уже представили здесь в своем ответе. Мне нужно помнить об этом. – matlehmann