Erlang:supervisor:terminate_child return 即使在最新版本中也有错误
Erlang: supervisor:terminate_child return error even in latest version
我正在尝试使用带有 simple_one_for_one
RestartStrategy 的主管,我想我有最新版本的 Erlang,但是当我尝试执行 supervisor:terminate_child
时它仍然以 {error,simple_one_for_one}
。根据 this 的回答,如果我的 Erlang 版本大于 R14B03,它应该可以工作,但我似乎无法在任何地方找到以 'R' 开头的版本。当我在 Erlang shell 中尝试 erlang:system_info(otp_release)
时,它 return 和 "24"
,我认为这是 2021 年 5 月发布的最新版本,但我看不出有其他原因这个问题。这是我的主管的样子:
-module(a_sup).
-behaviour(supervisor).
%% API
-export([start_link/0, init/1]).
start_link() ->
{ok, supervisor:start_link({local,?MODULE}, ?MODULE, [])}.
init(_Args) ->
RestartStrategy = {simple_one_for_one, 5, 3600},
ChildSpec = {
a_gen_server,
{a_gen_server, start_link, []},
permanent,
brutal_kill,
worker,
[a_gen_server]
},
{ok, {RestartStrategy,[ChildSpec]}}.
您没有显示终止 child 的代码,但您是否指示 child 使用标识符而不是 pid 终止? terminate_child/2 documentation 表示:
If the supervisor is simple_one_for_one, Id must be the pid() of the
child process. If the specified process is alive, but is not a child
of the specified supervisor, the function returns {error,not_found}.
If the child specification identifier is specified instead of a pid(),
the function returns {error,simple_one_for_one}.
关于版本问题:24.2 是撰写本文时的当前 Erlang/OTP 版本。版本号过去以 'R' 开头,但以 Erlang/OTP 结尾 17.0.
我正在尝试使用带有 simple_one_for_one
RestartStrategy 的主管,我想我有最新版本的 Erlang,但是当我尝试执行 supervisor:terminate_child
时它仍然以 {error,simple_one_for_one}
。根据 this 的回答,如果我的 Erlang 版本大于 R14B03,它应该可以工作,但我似乎无法在任何地方找到以 'R' 开头的版本。当我在 Erlang shell 中尝试 erlang:system_info(otp_release)
时,它 return 和 "24"
,我认为这是 2021 年 5 月发布的最新版本,但我看不出有其他原因这个问题。这是我的主管的样子:
-module(a_sup).
-behaviour(supervisor).
%% API
-export([start_link/0, init/1]).
start_link() ->
{ok, supervisor:start_link({local,?MODULE}, ?MODULE, [])}.
init(_Args) ->
RestartStrategy = {simple_one_for_one, 5, 3600},
ChildSpec = {
a_gen_server,
{a_gen_server, start_link, []},
permanent,
brutal_kill,
worker,
[a_gen_server]
},
{ok, {RestartStrategy,[ChildSpec]}}.
您没有显示终止 child 的代码,但您是否指示 child 使用标识符而不是 pid 终止? terminate_child/2 documentation 表示:
If the supervisor is simple_one_for_one, Id must be the pid() of the child process. If the specified process is alive, but is not a child of the specified supervisor, the function returns {error,not_found}. If the child specification identifier is specified instead of a pid(), the function returns {error,simple_one_for_one}.
关于版本问题:24.2 是撰写本文时的当前 Erlang/OTP 版本。版本号过去以 'R' 开头,但以 Erlang/OTP 结尾 17.0.