Current section
Files
Jump to
Current section
Files
lib/signalex.ex
defmodule Signalex do
@moduledoc """
Helper for handling OS signals. Usage is simple:
defmodule MyProject.SignalHandler do
use Signalex
def handle_event(:sigterm, state) do
# perform cleanup before the app terminates
{:ok, state}
end
end
By default, only `sigusr1`, `sigquit` and `sigterm` are automatially listened
for. If you want to listen to a different signal, you must specify one or many:
use Signalex, handle: :sigusr2
# or a list
use Signalex, handle: [:sigusr1, :sigusr2]
"""
defmacro __using__(opts) do
quote location: :keep do
@before_compile Signalex
def start(args \\ []) do
signals = case Keyword.get(unquote(opts), :handle) do
nil -> []
signals when is_list(signals) -> signals
signal -> [signal]
end
for signal <- signals do
:os.set_signal(signal, :handle)
end
:gen_event.add_handler(:erl_signal_server, __MODULE__, args)
end
def init(args) do
{:ok, args}
end
defoverridable [init: 1]
end
end
defmacro __before_compile__(_env) do
quote do
def handle_event(event, state) do
{:ok, state}
end
end
end
end