Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux Erlang,进程标志陷阱退出从CLI终止我的gen_服务器_Linux_Erlang_Command Line Interface_Gen Server - Fatal编程技术网

Linux Erlang,进程标志陷阱退出从CLI终止我的gen_服务器

Linux Erlang,进程标志陷阱退出从CLI终止我的gen_服务器,linux,erlang,command-line-interface,gen-server,Linux,Erlang,Command Line Interface,Gen Server,我有一台正在使用的gen_服务器: -module(user_info_provider). -export([start_link/0, stop/0]). -export([init/1, terminate/2, handle_info/2, handle_call/3, handle_cast/2, code_change/3]). -export([request_user_info/2]). -behaviour(gen_server). start_link() ->

我有一台正在使用的gen_服务器:

-module(user_info_provider).
-export([start_link/0, stop/0]).
-export([init/1, terminate/2, handle_info/2, handle_call/3, handle_cast/2,
 code_change/3]).
-export([request_user_info/2]).

-behaviour(gen_server).

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

stop() ->
    gen_server:cast(?MODULE, stop).

request_user_info(From,UserId) ->
    gen_server:cast(?MODULE, {request_user_info, From, UserId}).
%% Callback Functions
init(_) ->
    process_flag(trap_exit, true),
    io:format("I am ~w ~n", [self()]),
    {ok, null}.
%% @doc terminate
terminate(Reason, _LoopData) ->
    io:format("Terminating by ~w~n",[Reason]),
    {ok, null}.
handle_cast({request_user_info,From,UserId}, LoopData) ->
    {noreply, LoopData};
handle_cast(stop, LoopData) ->
    {stop, normal, LoopData}.
handle_info(_Info, State) ->
    {ok, State}.
code_change(_OldVsn, State, _Extra) ->
    {ok, State}.
handle_call(_,_From,LoopData) ->
    {ok,ok,LoopData}.
问题是,正如我接下来所展示的,如果我从cli执行它,比如
erl-pa ebin/-s user\u info\u provider start\u link
,它会立即消失,但随后我可以从控制台生成它,它会工作

erl -pa ebin -s user_info_provider start_link
Erlang R14B02 (erts-5.8.3) [source] [smp:4:4] [rq:4] [async-threads:0] [kernel-poll:false]

I am <0.32.0> 
Terminating by normal
Eshell V5.8.3  (abort with ^G)
1> user_info_provider:start_link().
I am <0.35.0> 
{ok,<0.35.0>}
erl-pa ebin-s用户信息提供商启动链接
Erlang R14B02(erts-5.8.3)[源代码][smp:4:4][rq:4][异步线程:0][内核轮询:false]
我是
以正常方式终止
Eshell V5.8.3(使用^G中止)
1> 用户\信息\提供程序:启动\链接()。
我是
{好的,}
如果我没有设置
process\u标志(trap\u exit,true)
或者我没有使用
-s模块功能直接从控制台启动它,则不会发生这种情况

我之所以这样启动它,是因为真正的gen_服务器要复杂得多,我正在从Makefile调用中独立测试它。

有什么想法吗?

与主管一起执行最小应用程序(钢筋可以生成此类应用程序的框架),并使用-s从cli运行它。

与主管一起执行最小应用程序(钢筋可以生成此类应用程序的框架)并使用-s从cli运行它。

解决方案是
W55tKQbuRu28Q4xv
建议的解决方案,或者不使用
start\u链接
,只使用
start
。发生的情况如下:

-s
参数由
init
处理。大致上,init将
生成一个新进程,然后使用该进程初始化并运行中的所有
-s
参数。之后,这个派生的进程将退出

由于init进程退出,并且您陷阱退出,因此您的进程将收到一条消息
{'EXIT',p,Reason}
,其中
p
是init进程生成的pid()。此消息由流程的
gen_服务器
部分处理。通常,这样的消息会被转发到您的
handle\u info/2
回调(该回调在您的代码中有错误的返回值,顺便说一句,应该是noreply)。但在这种情况下,它不会被转发。原因是
genu服务器
包含其父进程的概念。它通过进程字典和由
proc_lib
放在那里的值
“$concenters”
来记录哪个进程产生了它。现在,如果退出消息来自父级,则立即调用terminate回调并终止进程。这样的消息将不会转发给您。这就是你看到的


解决方案是创建一个小型应用程序,一个主管,并将您的流程置于该主管之下。然后从-s调用
application:start(您的应用程序)
。这样做的原因是应用程序控制器单独运行。更好的解决方案是构建一个自动启动应用程序的版本。发布是您的应用程序及其依赖项与ERTS运行时捆绑在一起。这样一个版本完全靠自己生存,可以复制到目标主机并运行。因此,目标系统上不需要Erlang,因为该版本是自包含的。

解决方案是由
W55tKQbuRu28Q4xv
建议的,或者不使用
start\u link
,只使用
start
。发生的情况如下:

-s
参数由
init
处理。大致上,init将
生成一个新进程,然后使用该进程初始化并运行中的所有
-s
参数。之后,这个派生的进程将退出

由于init进程退出,并且您陷阱退出,因此您的进程将收到一条消息
{'EXIT',p,Reason}
,其中
p
是init进程生成的pid()。此消息由流程的
gen_服务器
部分处理。通常,这样的消息会被转发到您的
handle\u info/2
回调(该回调在您的代码中有错误的返回值,顺便说一句,应该是noreply)。但在这种情况下,它不会被转发。原因是
genu服务器
包含其父进程的概念。它通过进程字典和由
proc_lib
放在那里的值
“$concenters”
来记录哪个进程产生了它。现在,如果退出消息来自父级,则立即调用terminate回调并终止进程。这样的消息将不会转发给您。这就是你看到的

解决方案是创建一个小型应用程序,一个主管,并将您的流程置于该主管之下。然后从-s调用
application:start(您的应用程序)
。这样做的原因是应用程序控制器单独运行。更好的解决方案是构建一个自动启动应用程序的版本。发布是您的应用程序及其依赖项与ERTS运行时捆绑在一起。这样一个版本完全靠自己生存,可以复制到目标主机并运行。因此,目标系统上不需要Erlang,因为该版本是自包含的。

Great answer@“我给出垃圾答案”:D,看起来我又一次忘记了Erlang实际上几乎是一个操作系统,一切都是一个生死攸关的过程。Great answer@“我给出垃圾答案”:D,看起来我又一次忘记了erlang实际上几乎是一个操作系统,一切都是一个生死攸关的过程。