我有一个应用程序,它使用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
答案 0 :(得分:1)
无法从内部捕获突然的BEAM OS进程退出。它是一个自定义属性:BEAM进程突然终止,因此无法运行任何代码(因为它已终止)
因此,如果BEAM被残酷终止,则不会调用回调。
因此,一种解决方案是不使用Ctrl-C
退出会话。相反,您可以尝试调用:init.stop
,它应该优雅地关闭监督树。