내 Erlang 애플리케이션이 충돌하는 이유는 무엇입니까?
문제
저는 간단한 얼랭 애플리케이션을 구축 중이고 환경에 매우 익숙하지 않기 때문에 발생하는 일부 오류를 이해하는 데 어려움을 겪고 있습니다.내 문제의 근본 원인이 여기에 있는지 잘 모르겠습니다. 따라서 게시하지 않은 내용이 있으면 알려 주시기 바랍니다.
내가 실행 중인 모듈의 소스:
-module(basilisk_server).
-author("Oak").
-export([start_link/2,start/0,start/1,start/2, stop/1]).
-behaviour(application).
-record(options,{
port = 6890,
server_opts = []
}).
-define(LocalIP,"192.168.64.128").
start()->
start([]).
start(Args)->
#options{port = Port, server_opts = ServerOpts} = parse_args(Args),
spawn(
fun() ->
start_link(Port, ServerOpts),
receive after infinity -> ok end
end)
.
start(_StartType, Args) ->
start(Args).
parse_args(Args) -> parse_args(Args, #options{}).
parse_args([], Opts) -> Opts;
parse_args([Head | Rest], Opts) ->
NewOpts =
case catch list_to_integer(Head) of
Port when is_integer(Port) ->
Opts#options{port = Port};
_Else ->
case Head of
"framed" ->
Opts#options{server_opts = [{framed, true} | Opts#options.server_opts]};
"" ->
Opts;
_Else ->
erlang:error({bad_arg, Head})
end
end,
parse_args(Rest, NewOpts)
.
stop(_State) ->
ok.
start_link(Port, ServerOpts) ->
io:format("Starting server on port ~p with args: ~p~n",[Port,ServerOpts]),
Services =
[
{"AuthenticationService",authenticationService_thrift},
{"UserRegistrationService",userRegistrationService_thrift}
]
,
{ok, _} = thrift_socket_server:start([
{ip, ?LocalIP},
{port, Port},
{name, ?MODULE},
{service, Services},
{handler,[
{"error_handler", thrift_error_handler},
{"AuthenticationService",authentication_service},
{"UserRegistrationService",user_registration_service}
]},
{socket_opts, [{recv_timeout, infinity}]}
]++
ServerOpts).
난 달린다 application:start(basilisk_server).
다음 순서로 메시지를 받습니다.
{error,{bad_return,{{basilisk_server,start,[normal,[]]},
<0.38.0>}}}
=INFO REPORT==== 29-Jul-2014::03:11:06 ===
application: basilisk_server
exited: {bad_return,{{basilisk_server,start,[normal,[]]},<0.38.0>}}
type: temporary
=ERROR REPORT==== 29-Jul-2014::03:11:06 ===
Error in process <0.38.0> with exit value: {terminated,[{io,format,
[<0.36.0>,"Starting server on port ~p with args: ~p~n",[6890,[]]],[]},
{basilisk_server,start_link,2,[{file,"src/basilisk_server.erl"},{line,55}]},
{basilisk_server,'-start/1-fun-0-',2,[{file,"src/basilisk_serve...
내가 겪고 있는 주요 문제는 오류의 실제 원인을 식별하는 것입니다.나는 그런 인상을 받았다. io:format
잠시 동안 문제가 되었지만 나는 그것이 "붉은 청어"였고 그 나쁜 결과가 내 문제의 근원이라고 믿습니다.거의 동일한 상태로 프로그램을 실행했는데 작동 중이었는데 갑자기 이 오류가 발생하기 시작했습니다.대부분의 변경 사항을 롤백했는데 멈추지 않았습니다.백그라운드 프로세스에 문제가 있을까봐 재부팅도 해보았습니다.
해결책
당신은 사용하고 있습니다 application:start
, 이는 귀하의 모듈이 다음을 준수할 것으로 예상합니다. application
행동.
그건:그것은 전화할 것이다 foo:start/2
, 애플리케이션이 시작되고 있음을 알려줍니다.돌아올 것으로 예상됩니다. {ok, Pid}
.이는 "응용 프로그램"에 문서화되어 있습니다. 장 OTP 디자인 원칙.
그러나 귀하의 start
함수가 즉시 호출됩니다. spawn
, 그리고 그 결과를 사용합니다.부터 spawn
보고 Pid
,보다는 {ok, Pid}
, application:start
예상 결과가 일치하지 않는다고 불평합니다.
그래서 당신이 보고 있는 거죠 bad_return
:
{error,{bad_return,{{basilisk_server,start,[normal,[]]},
<0.38.0>}}}
이것은 당신이 error
, 유형 bad_return
.전화하다가 일어난 일 basilisk_server:start(normal, [])
, 그리고 반환 값은 다음과 같습니다. <0.38.0>
(pid).
아, 그리고 또 다른 오류는 당신이 start_link
, 이는 두 프로세스가 연결되어 있음을 의미합니다.한 사람이 죽으면 다른 사람도 죽게 됩니다.이것이 당신이 보고 있는 것입니다. terminated
.이번 경우에는 도중에 사망하게 되었습니다. io:format
;다른 실행에서 죽기 전에 더 많은 것을 만들 수 있습니다.
또한 애플리케이션은 루트 감독자를 시작한다고 가정합니다(반환된 pid는 이에 대한 것입니다).
이 시점에서는 application
행동.사실, 나는 대부분의 코드가 필요하다고 확신하지 않습니다.그냥 전화해 thrift_socket_server:start
그리고 끝내세요.백그라운드에서 계속 실행됩니다.