我无法在退出iex -S mix

时间:2017-04-02 00:30:42

标签: erlang elixir

我有一个应用程序,它使用Application模块,并且还运行了GenServer个实例。此GenServer模块具有terminate回调。

如果我在服务器实例中强制发生某些错误,回调工作正常,但如果我使用iex -S mix中止Ctrl-C a会话或仅关闭控制台窗口(它应该写入某些内容),则不会触发文件)。

我已尝试将其放入init()

Process.flag(:trap_exit, true)

并在主模块中调用stop/1

def stop(state) do
  IO.puts "something" #never shown
  GenServer.stop(pid) #doesn't seem to work
end

1 个答案:

答案 0 :(得分:1)

来自Saša Jurić’s post

  

无法从内部捕获突然的BEAM OS进程退出。它是一个自定义属性:BEAM进程突然终止,因此无法运行任何代码(因为它已终止)

     

因此,如果BEAM被残酷终止,则不会调用回调。

因此,一种解决方案是不使用Ctrl-C退出会话。相反,您可以尝试调用:init.stop,它应该优雅地关闭监督树。