Erlang应用程序启动时永久不删除节点或依赖关闭

时间:2016-05-03 16:06:33

标签: erlang

我有一个带有单个依赖项的小模板项目。我正在寻找的行为是,当应用程序停止时,它会被停止,它的依赖关系也将被停止,节点将被关闭。在模板项目中,我有一个名为example的基本应用程序和一个名为depend的依赖应用程序。每个模块有3个模块:应用程序(后缀为_app),主要主管(后缀为_sup)和基本gen_server(后缀为_srv)。 depend已在{applications的{​​{1}}条目中注册。

根据Erlang文档:

  
      
  • 如果永久应用程序终止,则所有其他应用程序和运行时系统也将终止。
  •   

听起来不错。这正是我想要的。我用以下代码启动应用程序:

example.app

这很好用。我将每个回调日志记录到控制台的pid,函数名和args:

application:ensure_all_started(example, permanent).

然后我叫停止:

1> application:ensure_all_started(example, permanent).
<0.41.0>: depend_app:start(normal, [])
<0.41.0>: depend_sup:start_link()
<0.42.0>: depend_sup:init([])
<0.42.0>: depend_srv:start_link()
<0.43.0>: depend_srv:init([])
<0.46.0>: example_app:start(normal, [])
<0.46.0>: example_sup:start_link()
<0.47.0>: example_sup:init([])
<0.47.0>: example_srv:start_link()
<0.48.0>: example_srv:init([])

1> application:stop(example). <0.46.0>: example_app:prep_stop([]) <0.48.0>: example_srv:terminate(shutdown, []) <0.46.0>: example_app:stop([]) ok 2> =INFO REPORT==== 3-May-2016::08:22:41 === application: example exited: stopped type: permanent 2> 没有关闭,它只是坐在shell上。例如,如果我用depend强制终止应用程序,那么我会得到所需的行为(除了崩溃转储):

erlang:exit/2

但为什么不正常关闭?它似乎表现为3> erlang:exit(pid(0,46,0), kill). true <0.41.0>: depend_app:prep_stop([]) <0.43.0>: depend_srv:terminate(shutdown, []) <0.41.0>: depend_app:stop([]) 4> =INFO REPORT==== 3-May-2016::09:02:04 === application: example exited: killed type: permanent 4> {"Kernel pid terminated",application_controller,"{application_terminated,example,killed}"} Crash dump was written to: erl_crash.dump Kernel pid terminated (application_controller) ({application_terminated,example,killed}) D:\dev\app_test> transient应用程序,而不是我期望的temporary基于文档中的内容。

另外一个注释,我的版本已锁定到erts-5.10.4 / otp-R16B03-1。

1 个答案:

答案 0 :(得分:2)

在您引用的相同文档中略低一点:

  

通过调用,可以始终显式停止应用程序   application:stop/1。无论模式如何,都没有其他应用程序   影响。

你是正确的,只有当应用程序异常停止时它才有效,例如:杀害。请参阅this code - 停止应用程序时OTP执行的第一件事是取消链接进程并删除应用程序正在运行的信息。由于process terminated normally不会生成其他进程可以接收的任何信号,因此可以得出结论:检测依赖应用程序是否应该停止取决于application_controller与运行之间的链接应用