【问题标题】:I can't fire terminate callback on exiting iex -S mix我无法在退出 iex -S mix 时触发终止回调
【发布时间】:2017-08-27 01:36:59
【问题描述】:

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

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

我试过把它放在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

【问题讨论】:

标签: erlang elixir


【解决方案1】:

来自Saša Jurić’s post

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

因此,如果 BEAM 被粗暴地终止,回调将不会被调用。

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

【讨论】:

    猜你喜欢
    • 2015-12-19
    • 2017-01-30
    • 1970-01-01
    • 2011-08-17
    • 2017-12-07
    • 2019-10-05
    • 1970-01-01
    • 1970-01-01
    • 2011-02-18
    相关资源
    最近更新 更多