2017-04-02 11 views
0

Applicationモジュールを使用するアプリケーションがあり、GenServerインスタンスが実行されています。このGenServerモジュールにはterminateコールバックがあります。iex-Sを終了するとコールバックを終了できません。

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 
+0

これを参照してください:[GenServerのグレースフルシャットダウン](http://stackoverflow.com/questions/39756769/graceful-shutdown-of-genserver) – Sheharyar

答えて

1

Saša Jurić’s postから:

の方法はありません急激なBEAM OSプロセスのキャッチは、内部から終了します。

BEAMが無条件に終了すると、コールバックは呼び出されません。これは自己定義プロパティです。BEAMプロセスは突然終了するため、コードを実行できません。

したがって、解決策の1つは、Ctrl-Cを使用してセッションを終了しないことです。代わりに、:init.stopに電話をかけて、管理ツリーを正常にシャットダウンすることができます。

関連する問題