@@ -47,12 +47,16 @@ def main():
47
47
48
48
import asyncio
49
49
50
+
50
51
from . import logging
51
52
from .logging import error_logger , format_exception , logger
52
53
53
54
args = parse_args ()
54
55
logging .setup (log_level = args .log_level , log_destination = args .log_to )
55
56
57
+ # register sigterm handler
58
+ register_sigterm_handler ()
59
+
56
60
logger .info ('Starting Azure Functions Python Worker.' )
57
61
logger .info ('Worker ID: %s, Request ID: %s, Host Address: %s:%s' ,
58
62
args .worker_id , args .request_id , args .host , args .port )
@@ -66,6 +70,46 @@ def main():
66
70
format_exception (ex )))
67
71
raise
68
72
73
+ def register_sigterm_handler ():
74
+ import signal
75
+ """
76
+ Registers a custom handler for the SIGTERM signal.
77
+
78
+ This function will set up a signal handler to intercept the SIGTERM signal,
79
+ which is typically sent to gracefully terminate a process. When SIGTERM is
80
+ received, the program will log the signal and perform a graceful shutdown
81
+ by calling sys.exit().
82
+
83
+ Windows Python Function is not supported and Windows does not support
84
+ SIGTERM.
85
+ """
86
+
87
+ def handle_sigterm (signum , frame ):
88
+ from . import dispatcher
89
+ import sys
90
+ from .logging import logger , flush_logger
91
+ import traceback
92
+ from azure_functions_worker .dispatcher import DispatcherMeta
93
+ from azure_functions_worker import loader
94
+ # Log the received signal
95
+ logger .info (f"SIGTERM received (signal: { signum } ). "
96
+ "Shutting down gracefully..." )
97
+
98
+ # Log the frame details to see whats executed when the signal was received
99
+ logger .info ("Frame details at signal receipt:"
100
+ f"\n { '' .join (traceback .format_stack (frame ))} " )
101
+
102
+ DispatcherMeta .__current_dispatcher__ = None
103
+
104
+ loader .uninstall ()
105
+
106
+ flush_logger ()
107
+
108
+ dispatcher .Dispatcher .stop ()
109
+ sys .exit (0 ) # Exit the program gracefully
110
+
111
+ signal .signal (signal .SIGTERM , handle_sigterm )
112
+
69
113
70
114
async def start_async (host , port , worker_id , request_id ):
71
115
from . import dispatcher
0 commit comments