Erlang 在Elixir escript中捕捉出口信号

Erlang 在Elixir escript中捕捉出口信号,erlang,elixir,Erlang,Elixir,我想写一个脚本,当它接收到HUP信号时重新加载它的配置。当我启动escript时,我正在OSX上,并在Activity Monitor中搜索任何新进程。当我这样做时,会弹出以下窗口:inet_gethost(两次)、erl_child_setup和beam.swp。当我向erl_child_安装程序发送SIGHUP时,它会崩溃,并显示“erl_child_安装程序已关闭”的消息。当我将其发送到beam.swp时,会收到一条“挂断:1”的消息,但不会调用我的陷阱代码 下面是一些示例代码,说明了我要

我想写一个脚本,当它接收到HUP信号时重新加载它的配置。当我启动escript时,我正在OSX上,并在Activity Monitor中搜索任何新进程。当我这样做时,会弹出以下窗口:inet_gethost(两次)、erl_child_setup和beam.swp。当我向erl_child_安装程序发送SIGHUP时,它会崩溃,并显示“erl_child_安装程序已关闭”的消息。当我将其发送到beam.swp时,会收到一条“挂断:1”的消息,但不会调用我的陷阱代码

下面是一些示例代码,说明了我要做的事情:

defmodule TrapHup do

  def main(args) do
    Process.flag(:trap_exit, true)
    main_loop()
  end

  def main_loop() do
    receive do
      { :EXIT, _from, reason } -> 
        IO.puts "Caught exit!"
        IO.inspect reason
        main_loop()
    end
  end
end

我发现仅仅使用Elixir/Erlang是不可能的。显然,通过bash是可能的,如以下要点所示:

代码如下:

#!/usr/bin/env bash
set -x

term_handler() {
  echo "Stopping the server process with PID $PID"
  erl -noshell -name "term@127.0.0.1" -eval "rpc:call('app@127.0.0.1', init, stop, [])" -s init stop
  echo "Stopped"
}

trap 'term_handler' TERM INT

elixir --name app@127.0.0.1 -S mix run --no-halt &
PID=$!

echo "Started the server process with PID $PID"
wait $PID

# remove the trap if the first signal received or 'mix run' stopped for some reason
trap - TERM INT

# return the exit status of the 'mix run'
wait $PID
EXIT_STATUS=$?

exit $EXIT_STATUS

这是一个质量很差的答案。链接不应按原样发布,请阅读此资源的规则。相反,答案,解释如何等,以及相关的代码片段应该张贴在这里。