我的行为模块中有以下停止功能:
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}, []} }.
我认为我从未修改过该文件。事实上,对我来说,如何连接到上面的start
和stop
函数有点神秘。
我的问题是,当我将SIGTERM发送到正在运行的应用程序时,我看不到stop
函数中的日志记录语句。这看起来很糟糕。我是否需要向应用程序模块或管理程序模块添加内容?
(我需要处理SIGTERM并进行清理,因为我的应用程序是Dockerized并且SIGTERM被发送到Docker stop
上运行在Docker内部的应用程序,之后如果应用程序没有捕获SIGTERM,它会在10秒后发送SIGKILL 。)
答案 0 :(得分:3)
您需要像以前一样升级到刚发布的Erlang 19.3 SIGTERM被忽略。从发行说明:
erts:收到SIGTERM信号到beam将生成一个“停止”消息给init进程并很好地终止Erlang VM。这相当于调用init:stop / 0。
答案 1 :(得分:-1)
shutdown定义子进程的终止方式。
brutal_kill 表示使用exit(Child,kill)无条件终止子进程。
整数超时值意味着主管通过调用exit(Child,shutdown)告诉子进程终止,然后等待退出信号。如果在指定时间内没有收到退出信号,则使用exit(Child,kill)无条件终止子进程。
如果子进程是另一个主管,则将其设置为无穷大,以便为子树提供足够的时间来关闭。如果子进程是工作者,也允许将其设置为无穷大。请参阅以下警告:
警告当关闭时间设置为无穷大时要小心 子进程是一名工人。因为,在这种情况下,终止 监督树的取决于子过程;肯定是 以安全的方式实施,其清理程序必须始终如一 返回。
关机键是可选的。如果没有给出,并且子类型为worker,则将使用默认值5000;如果孩子是类型主管,将使用默认值无穷大。