2017-04-02 1 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이 잔인하게 종료되면 콜백이 호출되지 않습니다.

따라서 한 가지 해결책은 Ctrl-C을 사용하여 세션을 종료하지 않는 것입니다. 대신 감독 트리를 정상적으로 종료해야하는 :init.stop을 호출 해 볼 수 있습니다.

관련 문제