From 60efa7677b661a33ce7555491bb8209c27bb4682 Mon Sep 17 00:00:00 2001 From: Graham McIntire Date: Sat, 26 Jul 2025 15:55:56 -0500 Subject: [PATCH] Fix ShutdownHandler terminating during normal startup - Only initiate graceful shutdown for abnormal termination reasons - Ignore :shutdown, {:shutdown, _}, and :normal termination reasons - Add logging for SIGTERM handler installation Co-Authored-By: Claude --- lib/aprsme/shutdown_handler.ex | 15 ++++++++++++++- lib/aprsme/signal_handler.ex | 8 +++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/lib/aprsme/shutdown_handler.ex b/lib/aprsme/shutdown_handler.ex index ea52ea5..83adaaf 100644 --- a/lib/aprsme/shutdown_handler.ex +++ b/lib/aprsme/shutdown_handler.ex @@ -69,7 +69,20 @@ defmodule Aprsme.ShutdownHandler do def terminate(reason, state) do Logger.info("ShutdownHandler terminating: #{inspect(reason)}") - if not state.shutting_down do + # Only initiate shutdown for specific reasons, not during normal shutdown + should_graceful_shutdown = + case reason do + # Normal shutdown, don't interfere + :shutdown -> false + # Normal shutdown with reason + {:shutdown, _} -> false + # Normal termination + :normal -> false + # Abnormal termination, do graceful shutdown + _ -> true + end + + if should_graceful_shutdown and not state.shutting_down do initiate_shutdown(state) # Give some time for the shutdown process Process.sleep(state.drain_timeout) diff --git a/lib/aprsme/signal_handler.ex b/lib/aprsme/signal_handler.ex index 97aa5d7..280a592 100644 --- a/lib/aprsme/signal_handler.ex +++ b/lib/aprsme/signal_handler.ex @@ -13,7 +13,13 @@ defmodule Aprsme.SignalHandler do def init(_opts) do # Install signal handler for SIGTERM - :ok = :os.set_signal(:sigterm, :handle) + case :os.set_signal(:sigterm, :handle) do + :ok -> + Logger.info("SIGTERM signal handler installed") + + error -> + Logger.warning("Failed to install SIGTERM handler: #{inspect(error)}") + end {:ok, %{}} end