Erlang:应用程序行为是否陷入SIGTERM?

时间:2017-03-20 19:53:56

标签: erlang

我的行为模块中有以下停止功能:

start(_StartType, _StartArgs) ->
    ...
stop(_State) ->
    lager:info("Stop recieved."),
    erlang:display("Stop recieved."),
    ok.

我的应用程序主管看起来像:

-behaviour(supervisor).

%% API
-export([start_link/0]).

%% Supervisor callbacks
-export([init/1]).

-define(SERVER, ?MODULE).

%%====================================================================
%% API functions
%%====================================================================

start_link() ->
    supervisor:start_link({local, ?SERVER}, ?MODULE, []).

%%====================================================================
%% Supervisor callbacks
%%====================================================================

%% Child :: {Id,StartFunc,Restart,Shutdown,Type,Modules}
init([]) ->
    {ok, { {one_for_all, 0, 1}, []} }.

我认为我从未修改过该文件。事实上,对我来说,如何连接到上面的startstop函数有点神秘。

我的问题是,当我将SIGTERM发送到正在运行的应用程序时,我看不到stop函数中的日志记录语句。这看起来很糟糕。我是否需要向应用程序模块或管理程序模块添加内容?

(我需要处理SIGTERM并进行清理,因为我的应用程序是Dockerized并且SIGTERM被发送到Docker stop上运行在Docker内部的应用程序,之后如果应用程序没有捕获SIGTERM,它会在10秒后发送SIGKILL 。)

2 个答案:

答案 0 :(得分:3)

您需要像以前一样升级到刚发布的Erlang 19.3 SIGTERM被忽略。从发行说明:

  

erts:收到SIGTERM信号到beam将生成一个“停止”消息给init进程并很好地终止Erlang VM。这相当于调用init:stop / 0。

http://www.erlang.org/news/110

答案 1 :(得分:-1)

  

shutdown定义子进程的终止方式。

brutal_kill 表示使用exit(Child,kill)无条件终止子进程。

整数超时值意味着主管通过调用exit(Child,shutdown)告诉子进程终止,然后等待退出信号。如果在指定时间内没有收到退出信号,则使用exit(Child,kill)无条件终止子进程。

如果子进程是另一个主管,则将其设置为无穷大,以便为子树提供足够的时间来关闭。如果子进程是工作者,也允许将其设置为无穷大。请参阅以下警告:

  
    

警告当关闭时间设置为无穷大时要小心     子进程是一名工人。因为,在这种情况下,终止     监督树的取决于子过程;肯定是     以安全的方式实施,其清理程序必须始终如一     返回。

  

关机键是可选的。如果没有给出,并且子类型为worker,则将使用默认值5000;如果孩子是类型主管,将使用默认值无穷大。