Erlang 我能';t在退出iex-S混合时触发终止回调
我有一个应用程序,它使用Erlang 我能';t在退出iex-S混合时触发终止回调,erlang,elixir,Erlang,Elixir,我有一个应用程序,它使用application模块,还有一个GenServer实例正在运行。此GenServer模块具有terminate回调 如果我强制在服务器实例内部发生一些错误,则回调可以正常工作,但如果我使用Ctrl-ca中止iex-S mix会话或仅关闭控制台窗口(它应该写入某个文件),则不会触发回调 我已尝试将其放入init(): 并在主模块中调用stop/1: def stop(state) do IO.puts "something" #never shown GenSe
application
模块,还有一个GenServer
实例正在运行。此GenServer
模块具有terminate
回调
如果我强制在服务器实例内部发生一些错误,则回调可以正常工作,但如果我使用Ctrl-ca
中止iex-S mix
会话或仅关闭控制台窗口(它应该写入某个文件),则不会触发回调
我已尝试将其放入init()
:
并在主模块中调用stop/1
:
def stop(state) do
IO.puts "something" #never shown
GenServer.stop(pid) #doesn't seem to work
end
发件人:
没有办法从内部捕捉突然的光束OS进程出口。这是一个自定义属性:BEAM进程突然终止,因此无法运行任何代码(因为它已终止)
因此,如果BEAM被粗暴终止,则不会调用回调
因此,一种解决方案是不使用Ctrl-C
退出会话。相反,您可以尝试调用:init.stop
,这将正常关闭监控树。来自:
没有办法从内部捕捉突然的光束OS进程出口。这是一个自定义属性:BEAM进程突然终止,因此无法运行任何代码(因为它已终止)
因此,如果BEAM被粗暴终止,则不会调用回调
因此,一种解决方案是不使用Ctrl-C
退出会话。相反,您可以尝试调用:init.stop
,这将优雅地关闭监控树。请参见:请参见:
def stop(state) do
IO.puts "something" #never shown
GenServer.stop(pid) #doesn't seem to work
end