(sig, frame)
| 22 | |
| 23 | def setup_signal_handlers(http_server_process, process_manager): |
| 24 | def signal_handler(sig, frame): |
| 25 | if sig == signal.SIGINT: |
| 26 | logger.info("Received SIGINT (Ctrl+C), forcing immediate exit...") |
| 27 | if http_server_process: |
| 28 | kill_recursive(http_server_process) |
| 29 | |
| 30 | process_manager.terminate_all_processes() |
| 31 | logger.info("All processes have been forcefully terminated.") |
| 32 | sys.exit(0) |
| 33 | elif sig == signal.SIGTERM: |
| 34 | logger.info("Received SIGTERM, shutting down gracefully...") |
| 35 | if http_server_process and http_server_process.poll() is None: |
| 36 | http_server_process.send_signal(signal.SIGTERM) |
| 37 | |
| 38 | start_time = time.time() |
| 39 | while (time.time() - start_time) < 60: |
| 40 | if not is_process_active(http_server_process.pid): |
| 41 | logger.info("httpserver exit") |
| 42 | break |
| 43 | time.sleep(1) |
| 44 | |
| 45 | if time.time() - start_time < 60: |
| 46 | logger.info("HTTP server has exited gracefully") |
| 47 | else: |
| 48 | logger.warning("HTTP server did not exit in time, killing it...") |
| 49 | kill_recursive(http_server_process) |
| 50 | |
| 51 | process_manager.terminate_all_processes() |
| 52 | logger.info("All processes have been terminated gracefully.") |
| 53 | sys.exit(0) |
| 54 | |
| 55 | signal.signal(signal.SIGTERM, signal_handler) |
| 56 | signal.signal(signal.SIGINT, signal_handler) |
nothing calls this directly
no test coverage detected