Erlang 在Elixir escript中捕捉出口信号
我想写一个脚本,当它接收到HUP信号时重新加载它的配置。当我启动escript时,我正在OSX上,并在Activity Monitor中搜索任何新进程。当我这样做时,会弹出以下窗口:inet_gethost(两次)、erl_child_setup和beam.swp。当我向erl_child_安装程序发送SIGHUP时,它会崩溃,并显示“erl_child_安装程序已关闭”的消息。当我将其发送到beam.swp时,会收到一条“挂断:1”的消息,但不会调用我的陷阱代码 下面是一些示例代码,说明了我要做的事情: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”的消息,但不会调用我的陷阱代码 下面是一些示例代码,说明了我要
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
这是一个质量很差的答案。链接不应按原样发布,请阅读此资源的规则。相反,答案,解释如何等,以及相关的代码片段应该张贴在这里。