[Документация Yandex Cloud](../../index.md) > [Yandex Cloud Functions](../index.md) > [Концепции](index.md) > Уведомления о завершении выполнения функции

# Уведомления о завершении выполнения функции

В некоторых случаях сервис может принудительно остановить [экземпляр функции](function.md#function-instance). При этом в пользовательский код функции поступает _уведомление о предстоящем принудительном завершении работы_. 

В зависимости от заданного в [версии функции](function.md#version) таймаута и текущего состояния экземпляра функции, существует два типа таких уведомлений:

* [для активных экземпляров долгоживущих функций](#notify-when-active);
* [для неактивных экземпляров функций](#notify-when-idle).

Важнейшее различие между этими типами уведомлений — количество времени, которое дается функции на штатное завершение работы до того, как экземпляр будет завершен принудительно. Данное различие необходимо учитывать в обработчиках этих типов уведомлений.

## Уведомление пользовательского кода в активном экземпляре долгоживущей функции {#notify-when-active}

Этот тип уведомления направляется в пользовательский код функции при соблюдении следующих условий:

* функция является [долгоживущей](long-lived-functions.md);
* до истечения срока таймаута, заданного в настройках версии функции, остается более десяти минут;
* экземпляр функции в текущий момент активен, то есть обрабатывает как минимум один вызов функции.

Уведомление о предстоящей принудительной остановке экземпляра отправляется в пользовательский код функции в форме [POSIX-сигнала](https://man7.org/linux/man-pages/man7/signal.7.html) за десять минут до момента принудительного завершения работы экземпляра. 

По умолчанию в качестве уведомления отправляется сигнал [`SIGTERM` (Termination signal)](https://ru.wikipedia.org/wiki/SIGTERM). 

Вместо сигнала `SIGTERM` в пользовательский код функции может быть отправлен сигнал [`SIGINT` (Interrupt from keyboard)](https://ru.wikipedia.org/wiki/SIGINT). Для этого в версию функции необходимо добавить переменную окружения `X_YCF_GRACEFUL_SHUTDOWN_SIGNAL_SIGINT` со значением `1`.

Если позволяет [среда выполнения](runtime/index.md#runtimes), добавьте в функцию обработчик, который будет реагировать на поступающий от операционной системы POSIX-сигнал (`SIGTERM` или `SIGINT`). Это позволит избежать потери данных в случае нештатного завершения обработки вызова, обусловленного принудительной остановкой экземпляра функции.

Если в долгоживущей функции нет обработчика сигнала `SIGTERM`, то после отправки уведомления приложение пользователя будет закрыто операционной системой как приложение, проигнорировавшее сигнал завершения.

Вы можете отключить рассылку сигналов о предстоящей принудительной остановке экземпляра функции. Для этого в версию функции необходимо добавить переменную окружения `X_YCF_NO_GRACEFUL_SHUTDOWN_SIGNAL` со значением `1`. В этом случае у экземпляра функции будет также десять минут на завершение работы, но уведомление о принудительной остановке в пользовательский код функции направляться не будет.

## Уведомление пользовательского кода в неактивном экземпляре функции {#notify-when-idle}

Этот тип уведомления направляется в пользовательский код функции при условии, что экземпляр неактивен, то есть в текущий момент не обрабатывает ни одного вызова.

При принятии решения о принудительном завершении работы неактивного экземпляра функции в пользовательский код функции сначала направляется POSIX-сигнал `SIGTERM`, а затем (спустя 50 миллисекунд) — POSIX-сигнал `SIGKILL`, который принудительно остановит процесс.

Такая остановка экземпляра функции принудительно завершает все сетевые соединения на уровне L3 [сетевой модели OSI](https://ru.wikipedia.org/wiki/Сетевая_модель_OSI).

В коде функции вы можете использовать обработчик, чтобы перехватить поступивший сигнал `SIGTERM`. Так вы сможете, например, штатно завершить сессии в сетевых соединениях (на уровне L7 сетевой модели OSI).

{% note info %}

С момента отправки сигнала `SIGTERM` у функции есть не более 50 миллисекунд на выполнение необходимых операций.

{% endnote %}

Отправка уведомлений в пользовательский код неактивного экземпляра функции — безусловная. Она не зависит от заданного в версии функции значения таймаута. Отправку таких уведомлений нельзя отключить, нельзя выбрать другой вид сигнала или изменить время ожидания.