Elixir exrm控制台可以正常工作,但应用程序无法自动启动

时间:2015-06-11 00:20:47

标签: elixir exrm

asked a question previously关于让exrm为我的项目工作。答案让我明白了我可以构建我的版本(在开发模式下)并通过控制台访问它。

然而,有几个问题:

  1. 当我通过rel/my_app/bin/my_app console打开控制台时,我的应用程序实际上并未启动。我必须致电Application.start(:my_app)才能实现目标。

  2. 调用rel/my_app/bin/my_app start无法启动我的应用。我可以看到epmd,beam.smp和run_erl进程已经启动,但我自己的应用程序似乎没有运行。

  3. 很确定这两个问题是相关的。

    为控制台采取的步骤:

    $ mix release --dev
    $ ./rel/my_app/bin/my_app console
    iex(my_app@127.0.0.1)1> Application.start(:my_app)
    # at this point the app is running until I ctrl+c
    

    开始采取的步骤:

    $ mix release --dev
    $ ./rel/my_app/bin/my_app start
    
    $ ps aux | grep "my_app"
    
    12235   0.0  0.0  2460212    636   ??  S    11:10am   0:00.19 /Users/me/code/my_app/rel/my_app/erts-6.3.1/bin/epmd -daemon
    
    17565   0.0  0.2  2524256  26236 s008  Ss+   4:03pm   0:00.37 /Users/me/code/my_app/rel/my_app/erts-6.3.1/bin/beam.smp -- -root /Users/me/code/my_app/rel/my_app -progname Users/me/code/my_app/rel/my_app/bin/my_app -- -home /Users/me -- -boot /Users/me/code/my_app/rel/my_app/releases/0.0.1/my_app -boot_var ERTS_LIB_DIR /Users/me/code/my_app/rel/my_app/erts-6.3.1/../lib -config /Users/me/code/my_app/rel/my_app/releases/0.0.1/sys.config -pa /Users/me/code/my_app/rel/my_app/lib/consolidated -name my_app@127.0.0.1 -setcookie my_app -user Elixir.IEx.CLI -extra --no-halt +iex -- console
    
    17562   0.0  0.0  2452008    588   ??  S     4:03pm   0:00.00 /Users/me/code/my_app/rel/my_app/erts-6.3.1/bin/run_erl -daemon /Users/me/code/my_app/rel/my_app/tmp/erl_pipes/my_app/ /Users/me/code/my_app/rel/my_app/log exec "/Users/me/code/my_app/rel/my_app/bin/my_app" "console"
    
    $ tail /var/log/system.log
    
    Jun  9 16:03:14 me.local my_app[17565][17597]: Starting up
    

    我可以说我的应用程序没有运行,因为它应该从队列中消耗并写入数据存储。但是,在启动发行版时,永远不会消耗队列。不幸的是,除了一个“启动”行之外,我找不到更多的日志输出或错误。

    我是否需要传递给exrm的start命令以使其运行我的应用程序?

    如果没有,是否有办法通过将日志指向某处或检查内部流程来调试此问题?

2 个答案:

答案 0 :(得分:2)

查看之前发布的mix.exs,您需要将自己的应用添加到applications。这告诉VM应该在运行时启动哪些应用程序。某些应用程序是开箱即用的(例如:kernel:stdlib等),您无需添加这些应用程序,但您想要自动启动的任何应用程序都应该进入{{1} }。您可以将不需要在applications中启动的应用设置为加载但未启动的应用。

答案 1 :(得分:1)

您需要在mix.exs中定义您的应用才能自动启动它:

def application do
  [applications: [],
   mod: {MyAppModule, []}]
end

所以 mod:{MyAppModule,[]} 意味着将自动调用MyAppModule.start_link()。