2016-05-05 4 views
0

erlang.mkを使用してプログラムをシェルで実行しようとすると、次のエラーが発生します。Gen Server Error noproc

=INFO REPORT==== 5-May-2016::05:47:57 === 
application: rad 
exited: {bad_return, 
      {{rad_app,start,[normal,[]]}, 
      {'EXIT', 
       {noproc,{gen_server,call,[rad_config,{lookup,port}]}}}}} 
type: permanent 
Eshell V6.4 (abort with ^G) 
([email protected])1> {"Kernel pid terminated",application_controller,"{application_start_failure,rad,{bad_return,{{rad_app,start,[normal,[]]},{'EXIT',{noproc,{gen_server,call,[rad_config,{lookup,port}]}}}}}}"} 
Kernel pid terminated (application_controller) ({application_start_failure,rad,{bad_return,{{rad_app,start,[normal,[]]},{'EXIT',{noproc,{gen_server,call,[radheart: Thu May 5 05:47:58 2016: _coErlang is crashing .. (waiting for crash dump file)nf 
ig,{lookup,porheart: Thu May 5 05:47:58 2016: tWould reboot. Terminating.} 
]}}}}}}) 
make: *** [run] Error 1 

rad.app.src

{application, rad, 
[ 
{description, "Awesome server written in Erlang"}, 
{vsn, "0.0.1"}, 
{registered, [rad_sup, rad_config]}, 
{modules, []}, 
{applications, [ 
    kernel, 
    stdlib, 
    cowboy 
]}, 
{mod, {rad_app, []}}, 
{env, []} 
]}. 

rad_config.erl

-module(rad_config). 
-behaviour(gen_server). 

%% API 
-export([start_link/0]). 

%% Gen Server Callbacks 
-export([init/1 , handle_call/3 , handle_cast/2 , handle_info/2 , terminate/2 , code_change/3]). 
-export([lookup/1]). 

-define(SERVER, ?MODULE). 
-record(state, {conf}). 

start_link() -> 
    gen_server:start_link({local, ?SERVER}, ?MODULE, [], []). 

init([]) -> 
    {ok, Conf} = file:consult("config/rad.cfg"), 
    {ok, #state{conf = Conf}}. 

handle_call({lookup, Tag} , _From , State) -> 
    Reply = case lists:keyfind(Tag, 1, State#state.conf) of 
      {Tag, Value} -> 
       Value; 
        false -> 
         {error, noinstance} 
     end, 
    {reply, Reply, State}; 

handle_call(_Request, _From, State) -> 
    Reply = ok, 
    {reply, Reply, State}. 

handle_cast(_Msg , State) -> 
    {noreply, State}. 

handle_info(_Info , State) -> 
    {noreply, State}. 

terminate(Reason , _State) -> 
    io:format("~n Server shutdown. Reason: ~s.~n", [Reason]), 
    ok. 

code_change(_OldVsn , State , _Extra) -> 
    {ok, State}. 

lookup(Tag) -> 
    gen_server:call(?SERVER, {lookup, Tag}). 

rad_app.erl

-module(rad_app). 
-behaviour(application). 

-export([start/2]). 
-export([stop/1]). 

%% First we need to define and compile the dispatch list, a list of routes 
%% that Cowboy will use to map requests to handler modules. Then we tell 
%% Cowboy to listen for connections. 
start(_Type, _Args) -> 
    Port = rad_config:lookup(port), 

    Dispatch = cowboy_router:compile([ 
    {'_', [{"/", route_handler, []}]} 
     ]), 
    {ok, _} = cowboy:start_http(rad_http_listener, 100, 
    [{port, Port}], [{env, [{dispatch, Dispatch}]}]), 

    %% Start the supervisor 
    rad_sup:start_link(). 

stop(_State) -> 
    ok. 

rad_sup.erl

-module(rad_sup). 
-behaviour(supervisor). 

%% API 
-export([start_link/0]). 
%% Supervisor callbacks 
-export([init/1, shutdown/0]). 

-define(SERVER, ?MODULE). 

%% Helper macro for declaring children of supervisor 
-define(CHILD(I, Type), {I, {I, start_link, []}, permanent, 5000, Type, [I]}). 

%%   =================================================================== 
%% API functions 
%% =================================================================== 

start_link() -> 
    supervisor:start_link({local, ?SERVER}, ?MODULE, []). 

%% =================================================================== 
%% Supervisor callbacks 
%% =================================================================== 

init([]) -> 
    RestartStrategy = simple_one_for_one, 
    MaxRestarts = 10, 
    MaxSecondsBwRestarts = 5, 

    SupFlag = {RestartStrategy, MaxRestarts, MaxSecondsBwRestarts}, 

    Processes = [?CHILD(rad_config, worker)], 
    {ok, {SupFlag, Processes}}. 

%% Supervisor can be shutdown by calling exit(SupPid,shutdown) 
%% or, if it's linked to its parent, by parent calling exit/1. 
shutdown() -> 
    exit(whereis(?MODULE), shutdown). 

だから基本的に私は、エラーに関連する2つの質問はここにスローされてきたこと:私のgen_serverが起動できないため

  1. は、このエラーがスローされますか? file:consult/1に対応rad_config

  2. ラインは、私は、この関数はconfig/rad.cfgであるが、すべてのファイルが.erlsrcフォルダに格納されている、私はそれに渡されてきたパラメータのようにファイルをフェッチんどこからお願いしたいと思います。また、これらのフォルダsrcconfigは同じディレクトリレベルにあります。ですから、file:consult/1に渡されたパラメータは正しいですか?私は../config/rad.cfgとしてもパラメータを渡そうとしましたが。私はまだ同じエラーが発生します。

私を助けてください。私はnewからErlangだと私はかなりの時間このエラーを解決しようとしています。 Btw、私はErlang 17.5を使用しています。

答えて

3

rad_app.erlrad_configサーバーがまだ起動していない場合は、最初に実行したようです。そのときに、このラインにあなたのGET:

Port = rad_config:lookup(port) 

あなたが実際に呼び出している:

lookup(Tag) -> 
    gen_server:call(?SERVER, {lookup, Tag}). 

そしてgen_serverはそうあなたがnoprocエラーを取得している開始されていません。

さらに、サーバーが既に開始されていても、自分自身でgen_server:callを作成することはできません。自分自身でイベントを送信したい場合は、spawnを使用して新しいプロセスを開き、生成されたプロセスの内部から呼び出しを行うのが最善の方法です。

gen_serverOTPについて詳しくは、こちらをご覧ください。

関連する問題