- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在阅读 Erlang 文档,试图了解设置 OTP gen_server 和主管的基础知识。每当我的 gen_server 崩溃时,我的主管也会崩溃。事实上,每当我在命令行上出现错误时,我的主管就会崩溃。
我希望 gen_server 在崩溃时重新启动。我希望命令行错误对我的服务器组件没有任何影响。我的主管根本不应该崩溃。
我正在使用的代码是一个基本的“回声服务器”,它回复您发送的任何内容,以及一个最多每分钟重新启动回声服务器 5 次的主管(one_for_one)。我的代码:
echo_server.erl
-module(echo_server).
-behaviour(gen_server).
-export([start_link/0]).
-export([echo/1, crash/0]).
-export([init/1, handle_call/3, handle_cast/2]).
start_link() ->
gen_server:start_link({local, echo_server}, echo_server, [], []).
%% public api
echo(Text) ->
gen_server:call(echo_server, {echo, Text}).
crash() ->
gen_server:call(echo_server, crash)..
%% behaviours
init(_Args) ->
{ok, none}.
handle_call(crash, _From, State) ->
X=1,
{reply, X=2, State}.
handle_call({echo, Text}, _From, State) ->
{reply, Text, State}.
handle_cast(_, State) ->
{noreply, State}.
-module(echo_sup).
-behaviour(supervisor).
-export([start_link/0]).
-export([init/1]).
start_link() ->
supervisor:start_link(echo_sup, []).
init(_Args) ->
{ok, {{one_for_one, 5, 60},
[{echo_server, {echo_server, start_link, []},
permanent, brutal_kill, worker, [echo_server]}]}}.
erlc *.erl
编译,这是一个示例运行:
Erlang R13B01 (erts-5.7.2) [source] [smp:2:2] [rq:2] [async-threads:0] [kernel-p
oll:false]
Eshell V5.7.2 (abort with ^G)
1> echo_sup:start_link().
{ok,<0.37.0>}
2> echo_server:echo("hi").
"hi"
3> echo_server:crash().
=ERROR REPORT==== 5-May-2010::10:05:54 ===
** Generic server echo_server terminating
** Last message in was crash
** When Server state == none
** Reason for termination ==
** {'function not exported',
[{echo_server,terminate,
[{{badmatch,2},
[{echo_server,handle_call,3},
{gen_server,handle_msg,5},
{proc_lib,init_p_do_apply,3}]},
none]},
{gen_server,terminate,6},
{proc_lib,init_p_do_apply,3}]}
=ERROR REPORT==== 5-May-2010::10:05:54 ===
** Generic server <0.37.0> terminating
** Last message in was {'EXIT',<0.35.0>,
{{{undef,
[{echo_server,terminate,
[{{badmatch,2},
[{echo_server,handle_call,3},
{gen_server,handle_msg,5},
{proc_lib,init_p_do_apply,3}]},
none]},
{gen_server,terminate,6},
{proc_lib,init_p_do_apply,3}]},
{gen_server,call,[echo_server,crash]}},
[{gen_server,call,2},
{erl_eval,do_apply,5},
{shell,exprs,6},
{shell,eval_exprs,6},
{shell,eval_loop,3}]}}
** When Server state == {state,
{<0.37.0>,echo_sup},
one_for_one,
[{child,<0.41.0>,echo_server,
{echo_server,start_link,[]},
permanent,brutal_kill,worker,
[echo_server]}],
{dict,0,16,16,8,80,48,
{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],
[]},
{{[],[],[],[],[],[],[],[],[],[],[],[],[],[],
[],[]}}},
5,60,
[{1273,79154,701110}],
echo_sup,[]}
** Reason for termination ==
** {{{undef,[{echo_server,terminate,
[{{badmatch,2},
[{echo_server,handle_call,3},
{gen_server,handle_msg,5},
{proc_lib,init_p_do_apply,3}]},
none]},
{gen_server,terminate,6},
{proc_lib,init_p_do_apply,3}]},
{gen_server,call,[echo_server,crash]}},
[{gen_server,call,2},
{erl_eval,do_apply,5},
{shell,exprs,6},
{shell,eval_exprs,6},
{shell,eval_loop,3}]}
** exception exit: {{undef,
[{echo_server,terminate,
[{{badmatch,2},
[{echo_server,handle_call,3},
{gen_server,handle_msg,5},
{proc_lib,init_p_do_apply,3}]},
none]},
{gen_server,terminate,6},
{proc_lib,init_p_do_apply,3}]},
{gen_server,call,[echo_server,crash]}}
in function gen_server:call/2
4> echo_server:echo("hi").
** exception exit: {noproc,{gen_server,call,[echo_server,{echo,"hi"}]}}
in function gen_server:call/2
5>
最佳答案
从 shell 测试主管的问题是主管进程链接到 shell 进程。当 gen_server 进程崩溃时,退出信号会传播到崩溃并重新启动的 shell。
为了避免这个问题,向主管添加这样的内容:
start_in_shell_for_testing() ->
{ok, Pid} = supervisor:start_link(echo_sup, []),
unlink(Pid).
关于erlang OTP 主管崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2775114/
我有两个表 Employee 和 Department 此图像显示每个员工的经理。我想编写一个 SQL 查询,为我提供所有主管(经理、经理的经理......)的列表。 我只想要一个列,在给定特定员工时
我真的在和 Elixir 的主管们苦苦挣扎,想知道如何给他们命名以便我可以使用它们。基本上,我只是想启动一个受监督的 Task我可以向其发送消息。 所以我有以下内容: defmodule Run.Co
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许在 Stack Overflow 上提出有关通用计算硬件和软件的问题。您可以编辑问题,使其成为
我有一个 python 程序,我想不断运行更新并收集新数据。本质上,我正在从许多领域收集数据。我的处理器大约需要一天半的时间才能运行。一旦他们完成,我希望他们自动重新开始。 我不想使用 while 循
我正在管理一个通过 Supervisor 处理队列的 Celery worker。 这是我的/etc/supervisor/celery.conf: [program:celery] command
我的服务器操作系统是centOS。 # pwd /etc/supervisord.d 在这个路径我创建了一个文件: zarsamlog-worker.conf 它的内容: [program:larav
我正在尝试测试我的应用程序的一部分,其中包括一个主管和两个(不同的) worker 。我正在使用 eunit,所以在我的设置和清理中,我有: setup() -> {ok, Pid} = fo
我正在设置一个服务器来托管一个 Django 应用程序,它具有: uWSGI由 ubuntu 的 uWSGI init 脚本启动的应用程序 celeryd开始于 supervisord 所以我正在编写
我正在练习这个例子。 https://github.com/kwmiebach/how-to-elixir-supervisor 我按照说明进行操作并了解它是如何工作的,但我无法理解 Supervis
我正在使用supervisor来运行gunicorn。我配置了supervisored.conf当我想执行命令时: supervisorctl reread 我收到此错误: *** Unk
我安装了 supervisord使用管道。 并创建了配置文件 [program:sleep] command="/bin/sleep 1000" 但是当我重新启动服务时,我总是在日志中看到 INFO
我有一个有 N 个工作进程的主管。像往常一样,主管可以向工作进程发送消息,并且有一个 handle_cast将 worker 的回复发送给主管。 我如何检查所有 N 个 worker 是否都回复了主管
我已经用 gunicorn 部署了我的 flask 应用程序,当我使用 gunicorn 启动我的 flask 应用程序时,它工作正常。当我更改为使用主管观看 gunicorn 时,我可以访问我的网站
我在Docker上工作了几周,可以说我喜欢它,并且我明白了。但是我不知道的是如何“转移”我在Docker解决方案上的当前设置。我想我不是唯一的一个,这就是我的意思。 我是Python专家,尤其是Dja
我在supervisord中将docker与docker doc结合使用来创建带有我们使用的某些服务的测试环境。服务的基本配置正在运行,我可以/ bin / bash容器并从我的应用程序中使用它,而不
我尝试在 Ubuntu 服务器 16.04 上使用 Django+Supervisor+NGINX 部署我的网站。 这是我的 .conf(主管): [program:sitepro] command
我在 Ubuntu 12.04 上使用主管 3.0a8-1.1 运行 Django 1.4 站点,并且遇到了 gunicorn 0.17.2 和 gevent 0.13.8 的奇怪问题。 Superv
我终于设法让 supervisord 服务在服务器重新启动时运行 tutorial那部分效果很好。我对其进行了设置,使其最多运行 10 个 worker 。问题是当我第二天检查时,其中一些 worke
我希望使用 supervisor 来监控和运行 gunicorn 服务器。 当我运行时: /usr/bin/gunicorn app.wsgi:application -c config.conf 有
我已经实现了 gen_server 和 Supervisor:test_server 和 test_sup。我想从 shell/CLI 测试它们。我已经编写了它们的 start_link 函数,以便在
我是一名优秀的程序员,十分优秀!