feat(cth-peer): add brutal `kill/1` facility
This commit is contained in:
parent
8db70b5bbc
commit
b6a249baa9
|
@ -22,6 +22,7 @@
|
||||||
-export([start/2, start/3, start/4]).
|
-export([start/2, start/3, start/4]).
|
||||||
-export([start_link/2, start_link/3, start_link/4]).
|
-export([start_link/2, start_link/3, start_link/4]).
|
||||||
-export([stop/1]).
|
-export([stop/1]).
|
||||||
|
-export([kill/1]).
|
||||||
|
|
||||||
start(Name, Args) ->
|
start(Name, Args) ->
|
||||||
start(Name, Args, []).
|
start(Name, Args, []).
|
||||||
|
@ -66,6 +67,32 @@ stop(Node) when is_atom(Node) ->
|
||||||
ok
|
ok
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
%% @doc Kill a node abruptly, through mechanisms provided by OS.
|
||||||
|
%% Relies on POSIX `kill`.
|
||||||
|
kill(Node) ->
|
||||||
|
try erpc:call(Node, os, getpid, []) of
|
||||||
|
OSPid ->
|
||||||
|
Pid = whereis(Node),
|
||||||
|
_ = is_pid(Pid) andalso unlink(Pid),
|
||||||
|
Result = kill_os_process(OSPid),
|
||||||
|
%% Either ensure control process stops, or try to stop if not killed.
|
||||||
|
_ = is_pid(Pid) andalso catch peer:stop(Pid),
|
||||||
|
Result
|
||||||
|
catch
|
||||||
|
error:{erpc, _} = Reason ->
|
||||||
|
{error, Reason}
|
||||||
|
end.
|
||||||
|
|
||||||
|
kill_os_process(OSPid) ->
|
||||||
|
Cmd = "kill -SIGKILL " ++ OSPid,
|
||||||
|
Port = erlang:open_port({spawn, Cmd}, [binary, exit_status, hide]),
|
||||||
|
receive
|
||||||
|
{Port, {exit_status, 0}} ->
|
||||||
|
ok;
|
||||||
|
{Port, {exit_status, EC}} ->
|
||||||
|
{error, EC}
|
||||||
|
end.
|
||||||
|
|
||||||
parse_node_name(NodeName) ->
|
parse_node_name(NodeName) ->
|
||||||
case string:tokens(atom_to_list(NodeName), "@") of
|
case string:tokens(atom_to_list(NodeName), "@") of
|
||||||
[Name, Host] ->
|
[Name, Host] ->
|
||||||
|
|
Loading…
Reference in New Issue