diff --git a/apps/emqx/src/emqx_ctl.erl b/apps/emqx/src/emqx_ctl.erl index 448c47d74..8e8477f7c 100644 --- a/apps/emqx/src/emqx_ctl.erl +++ b/apps/emqx/src/emqx_ctl.erl @@ -75,7 +75,13 @@ start_link() -> gen_server:start_link({local, ?SERVER}, ?MODULE, [], []). -spec stop() -> ok. -stop() -> gen_server:stop(?SERVER). +stop() -> + try + gen_server:stop(?SERVER) + catch + exit:R when R =:= noproc orelse R =:= timeout -> + ok + end. -spec register_command(cmd(), {module(), atom()}) -> ok. register_command(Cmd, MF) when is_atom(Cmd) -> @@ -105,8 +111,9 @@ run_command(help, []) -> run_command(Cmd, Args) when is_atom(Cmd) -> case lookup_command(Cmd) of [{Mod, Fun}] -> - try Mod:Fun(Args) of - _ -> ok + try + _ = apply(Mod, Fun, [Args]), + ok catch _:Reason:Stacktrace -> ?SLOG(error, #{ @@ -141,7 +148,7 @@ help() -> lists:foreach( fun({_, {Mod, Cmd}, _}) -> print("~110..-s~n", [""]), - Mod:Cmd(usage) + apply(Mod, Cmd, [usage]) end, Cmds ) diff --git a/apps/emqx/test/emqx_ctl_SUITE.erl b/apps/emqx/test/emqx_ctl_SUITE.erl index 605466e79..9338576e4 100644 --- a/apps/emqx/test/emqx_ctl_SUITE.erl +++ b/apps/emqx/test/emqx_ctl_SUITE.erl @@ -107,9 +107,14 @@ cmd2_fun(["arg1", "arg2"]) -> ok; cmd2_fun(["arg1", "badarg"]) -> error(badarg). with_ctl_server(Fun) -> + ok = emqx_ctl:stop(), {ok, Pid} = emqx_ctl:start_link(), - _ = Fun(Pid), - ok = emqx_ctl:stop(). + try + _ = Fun(Pid), + ok + after + ok = emqx_ctl:stop() + end. mock_print() -> %% proxy usage/1,2 and print/1,2 to format_xx/1,2 funcs