【问题标题】:Elixir exrm console works but application does not start automaticallyElixir exrm 控制台工作,但应用程序没有自动启动
【发布时间】:2015-07-13 03:03:16
【问题描述】:

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 进程已经启动,但我自己的应用程序似乎没有运行。

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

为控制台采取的步骤:

$ 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 的启动命令以使其运行我的应用程序?

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

【问题讨论】:

    标签: elixir exrm


    【解决方案1】:

    查看您之前发布的mix.exs,您需要将自己的应用程序添加到applications。这告诉 VM 应该在运行时启动哪些应用程序。一些应用程序是开箱即用的(例如:kernel:stdlib 等),您不需要添加这些,但是您想要自动启动的任何内容都应该放在applications 中。您可以将不需要启动的应用程序放在included_applications,因为这些应用程序已加载但未启动。

    【讨论】:

    • :my_app 放入applications 列表会导致iex -S mixmix release 中的无限循环。我猜也许我应该在my_app 中创建一个单独的应用程序来执行实际工作,然后将其添加到applications 列表中?例如。 :my_app_worker
    • 实际上,我将:my_app 放入applications 是错误的,这不是必需的。你有这个项目的源链接可以分享吗?有些地方不太对劲,但仅通过 mix.exs 很难排除故障。
    【解决方案2】:

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

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

    所以 mod: {MyAppModule, []} 表示会自动调用 MyAppModule.start_link()。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-21
      • 1970-01-01
      • 2010-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多