diff --git a/apps/efka/src/efka_micro_service.erl b/apps/efka/src/efka_micro_service.erl index 326b8da..d74547c 100644 --- a/apps/efka/src/efka_micro_service.erl +++ b/apps/efka/src/efka_micro_service.erl @@ -349,38 +349,14 @@ kill_os_pid(OSPid) when is_integer(OSPid) -> %% 执行命令 -spec kill_service(WorkDir0 :: binary(), ExecCmd0 :: binary() | [binary()], OSPid :: integer()) -> no_return(). -kill_service(WorkDir0, ExecCmd0, OSPid) when is_binary(WorkDir0), is_binary(ExecCmd0) -> - WorkDir = binary_to_list(WorkDir0), - PortSettings = [ - {cd, WorkDir}, - exit_status - ], - - ExecCmd = binary_to_list(ExecCmd0), - RealExecCmd = filename:absname_join(WorkDir, ExecCmd), - Port = erlang:open_port({spawn_executable, RealExecCmd}, PortSettings), - receive - {Port, {exit_status, Code}} -> - lager:debug("[service] exit with code: ~p", [Code]) - after 5000 -> - kill_os_pid(OSPid) - end, - is_port(Port) andalso erlang:port_close(Port); -kill_service(WorkDir0, [ExecCmd0|Args], OSPid) when is_binary(WorkDir0), is_binary(ExecCmd0) -> - WorkDir = binary_to_list(WorkDir0), - PortSettings = [ - {cd, WorkDir}, - {args, [binary_to_list(A) || A <- Args]}, - exit_status - ], - ExecCmd = binary_to_list(ExecCmd0), - RealExecCmd = filename:absname_join(WorkDir, ExecCmd), - +kill_service(WorkDir0, ExecCmd0, OSPid) when is_binary(WorkDir0) -> + {RealExecCmd, PortSettings} = make_cmd(WorkDir0, ExecCmd0), Port = erlang:open_port({spawn_executable, RealExecCmd}, PortSettings), receive {Port, {exit_status, Code}} -> lager:debug("[service] exit with code: ~p", [Code]) after 5000 -> + erlang:port_close(Port), kill_os_pid(OSPid) end, is_port(Port) andalso erlang:port_close(Port). @@ -388,26 +364,7 @@ kill_service(WorkDir0, [ExecCmd0|Args], OSPid) when is_binary(WorkDir0), is_bina %% 启动微服务 -spec boot_service(WorkDir :: binary(), ExecCmd :: binary() | [binary()]) -> {ok, Port :: port()} | {error, Reason :: binary()}. boot_service(WorkDir0, ExecCmd0) when is_binary(WorkDir0), is_binary(ExecCmd0) -> - WorkDir = binary_to_list(WorkDir0), - PortSettings = [ - {cd, WorkDir}, - exit_status - ], - - ExecCmd = binary_to_list(ExecCmd0), - RealExecCmd = filename:absname_join(WorkDir, ExecCmd), - Port = erlang:open_port({spawn_executable, RealExecCmd}, PortSettings), - {ok, Port}; -boot_service(WorkDir0, [ExecCmd0|Args]) when is_binary(WorkDir0), is_binary(ExecCmd0) -> - WorkDir = binary_to_list(WorkDir0), - PortSettings = [ - {cd, WorkDir}, - {args, [binary_to_list(A) || A <- Args]}, - exit_status - ], - ExecCmd = binary_to_list(ExecCmd0), - RealExecCmd = filename:absname_join(WorkDir, ExecCmd), - + {RealExecCmd, PortSettings} = make_cmd(WorkDir0, ExecCmd0), Port = erlang:open_port({spawn_executable, RealExecCmd}, PortSettings), {ok, Port}. @@ -418,4 +375,25 @@ is_url(Input) when is_binary(Input) -> true catch _:_ -> false - end. \ No newline at end of file + end. + +-spec make_cmd(WorkDir0 :: binary(), Cmd0 :: binary() | [binary()]) -> {RealCmd :: string(), PortSettings :: list()}. +make_cmd(WorkDir0, Cmd0) when is_binary(Cmd0) -> + WorkDir = binary_to_list(WorkDir0), + PortSettings = [ + {cd, WorkDir}, + exit_status + ], + ExecCmd = binary_to_list(Cmd0), + RealExecCmd = filename:absname_join(WorkDir, ExecCmd), + {RealExecCmd, PortSettings}; +make_cmd(WorkDir0, [Cmd0|Args]) when is_binary(Cmd0) -> + WorkDir = binary_to_list(WorkDir0), + PortSettings = [ + {cd, WorkDir}, + {args, [binary_to_list(A) || A <- Args]}, + exit_status + ], + ExecCmd = binary_to_list(Cmd0), + RealExecCmd = filename:absname_join(WorkDir, ExecCmd), + {RealExecCmd, PortSettings}. \ No newline at end of file